diff --git a/share/libc/string.h b/share/libc/string.h
index 6f265a44d012653bdfd2dfbf0b4e6405e3e81331..577f35be8e00ab415db3769659bece22017e3f30 100644
--- a/share/libc/string.h
+++ b/share/libc/string.h
@@ -354,7 +354,7 @@ extern char *strerror(int errnum);
 extern char *strcpy(char *restrict dest, const char *restrict src);
 
 /*@ 
-  @ requires valid_string_src: valid_read_string(src);
+  @ requires valid_nstring_src: valid_read_nstring(src, n);
   @ requires room_nstring: \valid(dest+(0 .. n-1));
   @ requires separation:
   @   \separated(dest+(0..n-1), src+(0..n-1));
@@ -372,7 +372,9 @@ extern char *strcpy(char *restrict dest, const char *restrict src);
 extern char *strncpy(char *restrict dest,
 		     const char *restrict src, size_t n);
 
-/*@ // Non-POSIX, but often present
+/*@ // Non-POSIX, but often present; note that, unlike strncpy, this has no
+  @ // "official specification" other than manpages. They state that src is
+  @ // a *string*, therefore its precondition is stricter than that of strncpy.
   @ requires valid_string_src: valid_read_string(src);
   @ requires room_nstring: \valid(dest+(0..n-1));
   @ requires separation:
@@ -475,7 +477,8 @@ extern size_t strxfrm (char *restrict dest,
   @*/
 extern char *strdup (const char *s);
 
-/*@ allocates \result;
+/*@ requires valid_string_s: valid_read_string(s);
+  @ allocates \result;
   @ assigns \result \from indirect:s[0..strlen(s)], indirect:n,
   @                       indirect:__fc_heap_status;
   @ behavior allocation:
diff --git a/tests/builtins/oracle/memcpy.res.oracle b/tests/builtins/oracle/memcpy.res.oracle
index 9deb0bc5e01c04aaea0bbf5178f55316e8f09166..8e73401933cf18244067ab5c84f7b50c269d724f 100644
--- a/tests/builtins/oracle/memcpy.res.oracle
+++ b/tests/builtins/oracle/memcpy.res.oracle
@@ -1575,11 +1575,11 @@
             Unverifiable but considered Valid.
 [ Extern  ] Post-condition 'bounded_result'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns (file share/libc/string.h, line 380)
+[ Extern  ] Assigns (file share/libc/string.h, line 382)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 380)
+[ Extern  ] Froms (file share/libc/string.h, line 382)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 381)
+[ Extern  ] Froms (file share/libc/string.h, line 383)
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
             by Frama-C kernel.
@@ -1592,11 +1592,11 @@
             Unverifiable but considered Valid.
 [ Extern  ] Post-condition 'points_to_end'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns (file share/libc/string.h, line 392)
+[ Extern  ] Assigns (file share/libc/string.h, line 394)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 392)
+[ Extern  ] Froms (file share/libc/string.h, line 394)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 393)
+[ Extern  ] Froms (file share/libc/string.h, line 395)
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
             by Frama-C kernel.
@@ -1613,11 +1613,11 @@
             Unverifiable but considered Valid.
 [ Extern  ] Post-condition 'result_ptr'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns (file share/libc/string.h, line 403)
+[ Extern  ] Assigns (file share/libc/string.h, line 405)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 403)
+[ Extern  ] Froms (file share/libc/string.h, line 405)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 406)
+[ Extern  ] Froms (file share/libc/string.h, line 408)
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
             by Frama-C kernel.
@@ -1632,24 +1632,24 @@
             Unverifiable but considered Valid.
 [ Extern  ] Post-condition for 'partial' 'sum_of_bounded_lengths'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns for 'complete' (file share/libc/string.h, line 423)
+[ Extern  ] Assigns for 'complete' (file share/libc/string.h, line 425)
             Unverifiable but considered Valid.
-[ Extern  ] Assigns (file share/libc/string.h, line 417)
+[ Extern  ] Assigns (file share/libc/string.h, line 419)
             Unverifiable but considered Valid.
-[ Extern  ] Assigns for 'partial' (file share/libc/string.h, line 431)
-            Unverifiable but considered Valid.
-[ Extern  ] Froms for 'complete' (file share/libc/string.h, line 423)
+[ Extern  ] Assigns for 'partial' (file share/libc/string.h, line 433)
             Unverifiable but considered Valid.
 [ Extern  ] Froms for 'complete' (file share/libc/string.h, line 425)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 417)
+[ Extern  ] Froms for 'complete' (file share/libc/string.h, line 427)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 418)
+[ Extern  ] Froms (file share/libc/string.h, line 419)
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'partial' (file share/libc/string.h, line 431)
+[ Extern  ] Froms (file share/libc/string.h, line 420)
             Unverifiable but considered Valid.
 [ Extern  ] Froms for 'partial' (file share/libc/string.h, line 433)
             Unverifiable but considered Valid.
+[ Extern  ] Froms for 'partial' (file share/libc/string.h, line 435)
+            Unverifiable but considered Valid.
 [  Valid  ] Behavior 'complete'
             by Frama-C kernel.
 [  Valid  ] Default behavior
@@ -1663,11 +1663,11 @@
 
 [ Extern  ] Post-condition 'bounded_result'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns (file share/libc/string.h, line 443)
+[ Extern  ] Assigns (file share/libc/string.h, line 445)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 443)
+[ Extern  ] Froms (file share/libc/string.h, line 445)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 444)
+[ Extern  ] Froms (file share/libc/string.h, line 446)
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
             by Frama-C kernel.
@@ -1676,11 +1676,11 @@
 --- Properties of Function 'strxfrm'
 --------------------------------------------------------------------------------
 
-[ Extern  ] Assigns (file share/libc/string.h, line 452)
+[ Extern  ] Assigns (file share/libc/string.h, line 454)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 452)
+[ Extern  ] Froms (file share/libc/string.h, line 454)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 453)
+[ Extern  ] Froms (file share/libc/string.h, line 455)
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
             by Frama-C kernel.
@@ -1695,19 +1695,19 @@
             Unverifiable but considered Valid.
 [ Extern  ] Post-condition for 'no_allocation' 'result_null'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns for 'allocation' (file share/libc/string.h, line 465)
+[ Extern  ] Assigns for 'allocation' (file share/libc/string.h, line 467)
             Unverifiable but considered Valid.
 [ Extern  ] Assigns nothing
             Unverifiable but considered Valid.
 [ Extern  ] Assigns for 'no_allocation' nothing
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 465)
+[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 467)
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 466)
+[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 468)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 462)
+[ Extern  ] Froms (file share/libc/string.h, line 464)
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'no_allocation' (file share/libc/string.h, line 472)
+[ Extern  ] Froms for 'no_allocation' (file share/libc/string.h, line 474)
             Unverifiable but considered Valid.
 [  Valid  ] Behavior 'allocation'
             by Frama-C kernel.
@@ -1715,7 +1715,7 @@
             by Frama-C kernel.
 [  Valid  ] Behavior 'no_allocation'
             by Frama-C kernel.
-[ Extern  ] Frees/Allocates nothing/(file share/libc/string.h, line 461) 
+[ Extern  ] Frees/Allocates nothing/(file share/libc/string.h, line 463) 
             Unverifiable but considered Valid.
 [ Extern  ] Frees/Allocates for 'no_allocation' nothing/nothing 
             Unverifiable but considered Valid.
@@ -1730,19 +1730,19 @@
             Unverifiable but considered Valid.
 [ Extern  ] Post-condition for 'no_allocation' 'result_null'
             Unverifiable but considered Valid.
-[ Extern  ] Assigns for 'allocation' (file share/libc/string.h, line 483)
+[ Extern  ] Assigns for 'allocation' (file share/libc/string.h, line 486)
             Unverifiable but considered Valid.
 [ Extern  ] Assigns nothing
             Unverifiable but considered Valid.
 [ Extern  ] Assigns for 'no_allocation' nothing
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 483)
+[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 486)
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 484)
+[ Extern  ] Froms for 'allocation' (file share/libc/string.h, line 487)
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 479)
+[ Extern  ] Froms (file share/libc/string.h, line 482)
             Unverifiable but considered Valid.
-[ Extern  ] Froms for 'no_allocation' (file share/libc/string.h, line 493)
+[ Extern  ] Froms for 'no_allocation' (file share/libc/string.h, line 496)
             Unverifiable but considered Valid.
 [  Valid  ] Behavior 'allocation'
             by Frama-C kernel.
@@ -1750,7 +1750,7 @@
             by Frama-C kernel.
 [  Valid  ] Behavior 'no_allocation'
             by Frama-C kernel.
-[ Extern  ] Frees/Allocates nothing/(file share/libc/string.h, line 478) 
+[ Extern  ] Frees/Allocates nothing/(file share/libc/string.h, line 481) 
             Unverifiable but considered Valid.
 [ Extern  ] Frees/Allocates for 'no_allocation' nothing/nothing 
             Unverifiable but considered Valid.
@@ -1767,7 +1767,7 @@
             Unverifiable but considered Valid.
 [ Extern  ] Assigns nothing
             Unverifiable but considered Valid.
-[ Extern  ] Froms (file share/libc/string.h, line 509)
+[ Extern  ] Froms (file share/libc/string.h, line 512)
             Unverifiable but considered Valid.
 [  Valid  ] Default behavior
             by Frama-C kernel.
diff --git a/tests/libc/oracle/fc_libc.1.res.oracle b/tests/libc/oracle/fc_libc.1.res.oracle
index ed172048f4c391e586f81f1d78820d16d0d48d97..dec8b3a4cc8155162a1e2336cb10f2045e874691 100644
--- a/tests/libc/oracle/fc_libc.1.res.oracle
+++ b/tests/libc/oracle/fc_libc.1.res.oracle
@@ -5858,7 +5858,7 @@ char *strcpy(char *dest, char const *src)
   return dest;
 }
 
-/*@ requires valid_string_src: valid_read_string(src);
+/*@ requires valid_nstring_src: valid_read_nstring(src, n);
     requires room_nstring: \valid(dest + (0 .. n - 1));
     requires separation: \separated(dest + (0 .. n - 1), src + (0 .. n - 1));
     ensures result_ptr: \result ≡ \old(dest);
@@ -6145,7 +6145,8 @@ char *strdup(char const *s)
   return_label: return __retres;
 }
 
-/*@ assigns \result;
+/*@ requires valid_string_s: valid_read_string(s);
+    assigns \result;
     assigns \result
       \from (indirect: *(s + (0 .. strlen{Old}(s)))), (indirect: n),
             (indirect: __fc_heap_status);
diff --git a/tests/libc/oracle/netdb_c.res.oracle b/tests/libc/oracle/netdb_c.res.oracle
index 93b9bdbbe40ccc606dcc5036e9f45a7a50c22751..7245bc0aa8f2903a460e474cf1ab66f61ba3d344 100644
--- a/tests/libc/oracle/netdb_c.res.oracle
+++ b/tests/libc/oracle/netdb_c.res.oracle
@@ -243,7 +243,7 @@
   Called from share/libc/netdb.c:147.
 [eva] using specification for function strncpy
 [eva] share/libc/netdb.c:147: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] share/libc/netdb.c:147: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] share/libc/netdb.c:147: 
diff --git a/tests/libc/oracle/string_c.res.oracle b/tests/libc/oracle/string_c.res.oracle
index 01a4e906ea181e9a16394341b6a59aff9005809a..f07006ab7b9f349145414cf225baf363499be4b9 100644
--- a/tests/libc/oracle/string_c.res.oracle
+++ b/tests/libc/oracle/string_c.res.oracle
@@ -494,13 +494,13 @@
   function strlen: precondition 'valid_string_s' got status valid.
 [eva] Recording results for strlen
 [eva] Done for function strlen
-[eva] share/libc/string.h:405: 
+[eva] share/libc/string.h:407: 
   function strcat: postcondition 'sum_of_lengths' got status valid.
-[eva] share/libc/string.h:408: 
+[eva] share/libc/string.h:410: 
   function strcat: postcondition 'initialization,dest' got status valid.
-[eva] share/libc/string.h:409: 
+[eva] share/libc/string.h:411: 
   function strcat: postcondition 'dest_null_terminated' got status valid.
-[eva] share/libc/string.h:410: 
+[eva] share/libc/string.h:412: 
   function strcat: postcondition 'result_ptr' got status valid.
 [eva] Recording results for strcat
 [eva] Done for function strcat
@@ -598,7 +598,7 @@
 [eva] computing for function strncpy <- test_strncpy <- main.
   Called from tests/libc/string_c.c:154.
 [eva] tests/libc/string_c.c:154: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] tests/libc/string_c.c:154: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] tests/libc/string_c.c:154: 
@@ -618,7 +618,7 @@
 [eva] computing for function strncpy <- test_strncpy <- main.
   Called from tests/libc/string_c.c:157.
 [eva] tests/libc/string_c.c:157: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] tests/libc/string_c.c:157: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] tests/libc/string_c.c:157: 
@@ -633,7 +633,7 @@
 [eva] computing for function strncpy <- test_strncpy <- main.
   Called from tests/libc/string_c.c:159.
 [eva] tests/libc/string_c.c:159: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] tests/libc/string_c.c:159: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] tests/libc/string_c.c:159: 
@@ -644,7 +644,7 @@
 [eva] computing for function strncpy <- test_strncpy <- main.
   Called from tests/libc/string_c.c:161.
 [eva] tests/libc/string_c.c:161: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] tests/libc/string_c.c:161: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] tests/libc/string_c.c:161: 
diff --git a/tests/libc/oracle/string_c_generic.res.oracle b/tests/libc/oracle/string_c_generic.res.oracle
index 23daf7cb9257fd1bdee878600fe317860cfafaaa..41ee7f4cbff2f2b095c96af0332fb3ca82e2c204 100644
--- a/tests/libc/oracle/string_c_generic.res.oracle
+++ b/tests/libc/oracle/string_c_generic.res.oracle
@@ -155,7 +155,7 @@
 [eva] computing for function strncpy <- main.
   Called from tests/libc/string_c_generic.c:73.
 [eva] tests/libc/string_c_generic.c:73: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] tests/libc/string_c_generic.c:73: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] tests/libc/string_c_generic.c:73: 
@@ -194,7 +194,7 @@
 [eva] computing for function strncpy <- main.
   Called from tests/libc/string_c_generic.c:78.
 [eva] tests/libc/string_c_generic.c:78: 
-  function strncpy: precondition 'valid_string_src' got status valid.
+  function strncpy: precondition 'valid_nstring_src' got status valid.
 [eva] tests/libc/string_c_generic.c:78: 
   function strncpy: precondition 'room_nstring' got status valid.
 [eva] tests/libc/string_c_generic.c:78: 
@@ -252,9 +252,9 @@
   function strlen: postcondition 'acsl_c_equiv' got status valid.
 [eva] Recording results for strlen
 [eva] Done for function strlen
-[eva] share/libc/string.h:419: 
+[eva] share/libc/string.h:421: 
   function strncat: postcondition 'result_ptr' got status valid.
-[eva] share/libc/string.h:434: 
+[eva] share/libc/string.h:436: 
   function strncat, behavior partial: postcondition 'sum_of_bounded_lengths' got status valid.
 [eva] Recording results for strncat
 [eva] Done for function strncat
diff --git a/tests/libc/oracle/string_h.res.oracle b/tests/libc/oracle/string_h.res.oracle
index 55c5afe6dad117fc0beb325fa0f45052db727460..89300398e63a10d546dfe9bf14577b28a251225e 100644
--- a/tests/libc/oracle/string_h.res.oracle
+++ b/tests/libc/oracle/string_h.res.oracle
@@ -5,7 +5,7 @@
 [eva:initial-state] Values of globals at initialization
   nondet ∈ [--..--]
 [eva] computing for function test_strcmp <- main.
-  Called from tests/libc/string_h.c:112.
+  Called from tests/libc/string_h.c:139.
 [eva] computing for function strcmp <- test_strcmp <- main.
   Called from tests/libc/string_h.c:5.
 [eva] using specification for function strcmp
@@ -20,7 +20,7 @@
 [eva] Recording results for test_strcmp
 [eva] Done for function test_strcmp
 [eva] computing for function test_strcat <- main.
-  Called from tests/libc/string_h.c:113.
+  Called from tests/libc/string_h.c:140.
 [eva] computing for function strcat <- test_strcat <- main.
   Called from tests/libc/string_h.c:13.
 [eva] using specification for function strcat
@@ -43,7 +43,7 @@
 [eva] Recording results for test_strcat
 [eva] Done for function test_strcat
 [eva] computing for function test_strstr <- main.
-  Called from tests/libc/string_h.c:114.
+  Called from tests/libc/string_h.c:141.
 [eva] computing for function strstr <- test_strstr <- main.
   Called from tests/libc/string_h.c:24.
 [eva] using specification for function strstr
@@ -58,7 +58,7 @@
 [eva] Recording results for test_strstr
 [eva] Done for function test_strstr
 [eva] computing for function test_strncat <- main.
-  Called from tests/libc/string_h.c:115.
+  Called from tests/libc/string_h.c:142.
 [eva] tests/libc/string_h.c:34: Trace partitioning superposing up to 100 states
 [eva] computing for function strncat <- test_strncat <- main.
   Called from tests/libc/string_h.c:36.
@@ -73,7 +73,7 @@
 [eva] Recording results for test_strncat
 [eva] Done for function test_strncat
 [eva] computing for function crashes_gcc <- main.
-  Called from tests/libc/string_h.c:116.
+  Called from tests/libc/string_h.c:143.
 [eva] computing for function strcpy <- crashes_gcc <- main.
   Called from tests/libc/string_h.c:53.
 [eva] using specification for function strcpy
@@ -87,7 +87,7 @@
 [eva] Recording results for crashes_gcc
 [eva] Done for function crashes_gcc
 [eva] computing for function test_strtok <- main.
-  Called from tests/libc/string_h.c:117.
+  Called from tests/libc/string_h.c:144.
 [eva] computing for function strtok <- test_strtok <- main.
   Called from tests/libc/string_h.c:58.
 [eva] using specification for function strtok
@@ -152,7 +152,7 @@
 [eva] Recording results for test_strtok
 [eva] Done for function test_strtok
 [eva] computing for function test_strtok_r <- main.
-  Called from tests/libc/string_h.c:118.
+  Called from tests/libc/string_h.c:145.
 [eva] computing for function strtok_r <- test_strtok_r <- main.
   Called from tests/libc/string_h.c:82.
 [eva] using specification for function strtok_r
@@ -241,57 +241,95 @@
 [eva] Recording results for test_strtok_r
 [eva] Done for function test_strtok_r
 [eva] computing for function strdup <- main.
-  Called from tests/libc/string_h.c:119.
+  Called from tests/libc/string_h.c:146.
 [eva] using specification for function strdup
-[eva:libc:unsupported-spec] tests/libc/string_h.c:119: Warning: 
+[eva:libc:unsupported-spec] tests/libc/string_h.c:146: Warning: 
   The specification of function 'strdup' is currently not supported by Eva.
   Consider adding ./share/libc/string.c to the analyzed source files.
-[eva] tests/libc/string_h.c:119: Warning: ignoring unsupported \allocates clause
-[eva] tests/libc/string_h.c:119: 
+[eva] tests/libc/string_h.c:146: Warning: ignoring unsupported \allocates clause
+[eva] tests/libc/string_h.c:146: 
   function strdup: precondition 'valid_string_s' got status valid.
 [eva] Done for function strdup
 [eva] computing for function strndup <- main.
-  Called from tests/libc/string_h.c:120.
+  Called from tests/libc/string_h.c:147.
 [eva] using specification for function strndup
-[eva:libc:unsupported-spec] tests/libc/string_h.c:120: Warning: 
+[eva:libc:unsupported-spec] tests/libc/string_h.c:147: Warning: 
   The specification of function 'strndup' is currently not supported by Eva.
   Consider adding ./share/libc/string.c to the analyzed source files.
-[eva] tests/libc/string_h.c:120: Warning: ignoring unsupported \allocates clause
+[eva] tests/libc/string_h.c:147: Warning: ignoring unsupported \allocates clause
+[eva] tests/libc/string_h.c:147: 
+  function strndup: precondition 'valid_string_s' got status valid.
 [eva] Done for function strndup
-[eva] computing for function strlcpy <- main.
-  Called from tests/libc/string_h.c:123.
+[eva] computing for function strsignal <- main.
+  Called from tests/libc/string_h.c:148.
+[eva] using specification for function strsignal
+[eva] Done for function strsignal
+[eva] tests/libc/string_h.c:149: assertion got status valid.
+[eva] computing for function test_strncpy <- main.
+  Called from tests/libc/string_h.c:150.
+[eva] computing for function strncpy <- test_strncpy <- main.
+  Called from tests/libc/string_h.c:113.
+[eva] using specification for function strncpy
+[eva] tests/libc/string_h.c:113: 
+  function strncpy: precondition 'valid_nstring_src' got status valid.
+[eva] tests/libc/string_h.c:113: 
+  function strncpy: precondition 'room_nstring' got status valid.
+[eva] tests/libc/string_h.c:113: 
+  function strncpy: precondition 'separation' got status valid.
+[eva] Done for function strncpy
+[eva] computing for function strncpy <- test_strncpy <- main.
+  Called from tests/libc/string_h.c:118.
+[eva:alarm] tests/libc/string_h.c:118: Warning: 
+  function strncpy: precondition 'valid_nstring_src' got status invalid.
+[eva] tests/libc/string_h.c:118: 
+  function strncpy: no state left, precondition 'room_nstring' got status valid.
+[eva] tests/libc/string_h.c:118: 
+  function strncpy: no state left, precondition 'separation' got status valid.
+[eva] Done for function strncpy
+[eva] Recording results for test_strncpy
+[eva] Done for function test_strncpy
+[eva] computing for function test_strlcpy <- main.
+  Called from tests/libc/string_h.c:151.
+[eva] computing for function strlcpy <- test_strlcpy <- main.
+  Called from tests/libc/string_h.c:126.
 [eva] using specification for function strlcpy
-[eva] tests/libc/string_h.c:123: 
+[eva] tests/libc/string_h.c:126: 
   function strlcpy: precondition 'valid_string_src' got status valid.
-[eva] tests/libc/string_h.c:123: 
+[eva] tests/libc/string_h.c:126: 
   function strlcpy: precondition 'room_nstring' got status valid.
-[eva] tests/libc/string_h.c:123: 
+[eva] tests/libc/string_h.c:126: 
   function strlcpy: precondition 'separation' got status valid.
 [eva] Done for function strlcpy
-[eva] computing for function strlcpy <- main.
-  Called from tests/libc/string_h.c:124.
-[eva] tests/libc/string_h.c:124: 
+[eva] computing for function strlcpy <- test_strlcpy <- main.
+  Called from tests/libc/string_h.c:127.
+[eva] tests/libc/string_h.c:127: 
   function strlcpy: precondition 'valid_string_src' got status valid.
-[eva] tests/libc/string_h.c:124: 
+[eva] tests/libc/string_h.c:127: 
   function strlcpy: precondition 'room_nstring' got status valid.
-[eva] tests/libc/string_h.c:124: 
+[eva] tests/libc/string_h.c:127: 
   function strlcpy: precondition 'separation' got status valid.
 [eva] Done for function strlcpy
-[eva] computing for function strlcat <- main.
-  Called from tests/libc/string_h.c:125.
+[eva] computing for function strlcat <- test_strlcpy <- main.
+  Called from tests/libc/string_h.c:128.
 [eva] using specification for function strlcat
-[eva:alarm] tests/libc/string_h.c:125: Warning: 
+[eva:alarm] tests/libc/string_h.c:128: Warning: 
   function strlcat: precondition 'valid_string_src' got status unknown.
-[eva:alarm] tests/libc/string_h.c:125: Warning: 
+[eva:alarm] tests/libc/string_h.c:128: Warning: 
   function strlcat: precondition 'valid_string_dest' got status unknown.
-[eva] tests/libc/string_h.c:125: 
+[eva] tests/libc/string_h.c:128: 
   function strlcat: precondition 'room_nstring' got status valid.
 [eva] Done for function strlcat
-[eva] computing for function strsignal <- main.
-  Called from tests/libc/string_h.c:126.
-[eva] using specification for function strsignal
-[eva] Done for function strsignal
-[eva] tests/libc/string_h.c:127: assertion got status valid.
+[eva] computing for function strlcpy <- test_strlcpy <- main.
+  Called from tests/libc/string_h.c:132.
+[eva:alarm] tests/libc/string_h.c:132: Warning: 
+  function strlcpy: precondition 'valid_string_src' got status invalid.
+[eva] tests/libc/string_h.c:132: 
+  function strlcpy: no state left, precondition 'room_nstring' got status valid.
+[eva] tests/libc/string_h.c:132: 
+  function strlcpy: no state left, precondition 'separation' got status valid.
+[eva] Done for function strlcpy
+[eva] Recording results for test_strlcpy
+[eva] Done for function test_strlcpy
 [eva] Recording results for main
 [eva] done for function main
 [eva] ====== VALUES COMPUTED ======
@@ -306,11 +344,30 @@
          [6..9] ∈ UNINITIALIZED
 [eva:final-states] Values at end of function test_strcmp:
   res ∈ {0}
+[eva:final-states] Values at end of function test_strlcpy:
+  buf[0..15] ∈ [--..--]
+  buf2[0..5] ∈ [--..--]
+      [6..31] ∈ [--..--] or UNINITIALIZED
+  r1 ∈ {18}
+  r2 ∈ {5}
+  r3 ∈ [--..--]
+  src[0] ∈ {97}
+     [1] ∈ {98}
+     [2] ∈ {99}
+  dst[0..2] ∈ UNINITIALIZED
 [eva:final-states] Values at end of function test_strncat:
   data[0] ∈ [--..--]
       [1..99] ∈ [--..--] or UNINITIALIZED
   source[0..98] ∈ {90}
         [99] ∈ {0}
+[eva:final-states] Values at end of function test_strncpy:
+  src[0] ∈ {97}
+     [1] ∈ {98}
+     [2] ∈ {99}
+  dst[0..2] ∈ [--..--]
+  src2[0] ∈ {97}
+      [1] ∈ {98}
+      [2] ∈ UNINITIALIZED
 [eva:final-states] Values at end of function test_strstr:
   s ∈ {{ "aba" ; "bab" }}
   needle ∈ {{ "a" ; "b" }}
@@ -337,11 +394,5 @@
   __fc_strtok_ptr ∈ {{ "constant!" + [0..--] }}
   a ∈ [--..--]
   b ∈ [--..--]
-  buf[0..15] ∈ [--..--]
-  buf2[0..5] ∈ [--..--]
-      [6..31] ∈ [--..--] or UNINITIALIZED
-  r1 ∈ {18}
-  r2 ∈ {5}
-  r3 ∈ [--..--]
   strsig ∈ {{ &__fc_strsignal[0] }}
   __retres ∈ {0}
diff --git a/tests/libc/string_h.c b/tests/libc/string_h.c
index 27065864dd54811732a6107eecaeca8386c9422f..0b264a615662d7fe36471bf30fbcea0f87dd90d7 100644
--- a/tests/libc/string_h.c
+++ b/tests/libc/string_h.c
@@ -107,6 +107,33 @@ void test_strtok_r() {
   }
 }
 
+void test_strncpy() {
+  char src[] = { 'a', 'b', 'c' };
+  char dst[3];
+  strncpy(dst,src,3);
+  char src2[3];
+  src2[0] = 'a';
+  src2[1] = 'b';
+  if (nondet) {
+    strncpy(dst,src2,3);
+    //@ assert unreachable: \false;
+  }
+}
+
+void test_strlcpy() {
+  char buf[16];
+  char buf2[32];
+  size_t r1 = strlcpy(buf, "longer than buffer", 16);
+  size_t r2 = strlcpy(buf2, "short", 16);
+  size_t r3 = strlcat(buf2, buf, 32);
+  char src[] = { 'a', 'b', 'c' };
+  char dst[3];
+  if (nondet) {
+    strlcpy(dst,src,3);
+    //@ assert unreachable: \false;
+  }
+}
+
 int main(int argc, char **argv)
 {
   test_strcmp();
@@ -118,12 +145,9 @@ int main(int argc, char **argv)
   test_strtok_r();
   char *a = strdup("bla"); // unsound; specification currently unsupported
   char *b = strndup("bla", 2); // unsound; specification currently unsupported
-  char buf[16];
-  char buf2[32];
-  size_t r1 = strlcpy(buf, "longer than buffer", 16);
-  size_t r2 = strlcpy(buf2, "short", 16);
-  size_t r3 = strlcat(buf2, buf, 32);
   char *strsig = strsignal(1);
   //@ assert valid_read_string(strsig);
+  test_strncpy();
+  test_strlcpy();
   return 0;
 }