Skip to content
Snippets Groups Projects
Commit 0b5b8594 authored by Andre Maroneze's avatar Andre Maroneze
Browse files

[libc] improve spec of strrchr

parent 1dc56f25
No related branches found
Tags 22.0+r2
No related merge requests found
...@@ -195,7 +195,7 @@ extern char *strchr(const char *s, int c); ...@@ -195,7 +195,7 @@ extern char *strchr(const char *s, int c);
extern char *strchrnul(const char *s, int c); extern char *strchrnul(const char *s, int c);
/*@ requires valid_string_s: valid_read_string(s); /*@ requires valid_string_s: valid_read_string(s);
@ assigns \result \from s, s[0..],c; @ assigns \result \from s, indirect:s[0 .. strlen(s)], indirect:c;
@ behavior found: @ behavior found:
@ assumes char_found: strchr(s,c); @ assumes char_found: strchr(s,c);
@ ensures result_char: *\result == c; @ ensures result_char: *\result == c;
...@@ -207,6 +207,8 @@ extern char *strchrnul(const char *s, int c); ...@@ -207,6 +207,8 @@ extern char *strchrnul(const char *s, int c);
@ behavior default: @ behavior default:
@ ensures result_null_or_same_base: @ ensures result_null_or_same_base:
@ \result == \null || \base_addr(\result) == \base_addr(s); @ \result == \null || \base_addr(\result) == \base_addr(s);
@ ensures result_null_or_points_to_same:
@ \result == \null || \subset(\result, s + (0 .. strlen(s)));
@*/ @*/
extern char *strrchr(const char *s, int c); extern char *strrchr(const char *s, int c);
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
[eva:initial-state] Values of globals at initialization [eva:initial-state] Values of globals at initialization
nondet ∈ [--..--] nondet ∈ [--..--]
[eva] computing for function test_strcmp <- main. [eva] computing for function test_strcmp <- main.
Called from string_h.c:139. Called from string_h.c:147.
[eva] computing for function strcmp <- test_strcmp <- main. [eva] computing for function strcmp <- test_strcmp <- main.
Called from string_h.c:5. Called from string_h.c:5.
[eva] using specification for function strcmp [eva] using specification for function strcmp
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
[eva] Recording results for test_strcmp [eva] Recording results for test_strcmp
[eva] Done for function test_strcmp [eva] Done for function test_strcmp
[eva] computing for function test_strcat <- main. [eva] computing for function test_strcat <- main.
Called from string_h.c:140. Called from string_h.c:148.
[eva] computing for function strcat <- test_strcat <- main. [eva] computing for function strcat <- test_strcat <- main.
Called from string_h.c:13. Called from string_h.c:13.
[eva] using specification for function strcat [eva] using specification for function strcat
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
[eva] Recording results for test_strcat [eva] Recording results for test_strcat
[eva] Done for function test_strcat [eva] Done for function test_strcat
[eva] computing for function test_strstr <- main. [eva] computing for function test_strstr <- main.
Called from string_h.c:141. Called from string_h.c:149.
[eva] computing for function strstr <- test_strstr <- main. [eva] computing for function strstr <- test_strstr <- main.
Called from string_h.c:24. Called from string_h.c:24.
[eva] using specification for function strstr [eva] using specification for function strstr
...@@ -51,14 +51,14 @@ ...@@ -51,14 +51,14 @@
function strstr: precondition 'valid_string_haystack' got status valid. function strstr: precondition 'valid_string_haystack' got status valid.
[eva] string_h.c:24: [eva] string_h.c:24:
function strstr: precondition 'valid_string_needle' got status valid. function strstr: precondition 'valid_string_needle' got status valid.
[eva] FRAMAC_SHARE/libc/string.h:243: [eva] FRAMAC_SHARE/libc/string.h:245:
cannot evaluate ACSL term, unsupported ACSL construct: logic function memcmp cannot evaluate ACSL term, unsupported ACSL construct: logic function memcmp
[eva] Done for function strstr [eva] Done for function strstr
[eva:alarm] string_h.c:25: Warning: assertion got status unknown. [eva:alarm] string_h.c:25: Warning: assertion got status unknown.
[eva] Recording results for test_strstr [eva] Recording results for test_strstr
[eva] Done for function test_strstr [eva] Done for function test_strstr
[eva] computing for function test_strncat <- main. [eva] computing for function test_strncat <- main.
Called from string_h.c:142. Called from string_h.c:150.
[eva] string_h.c:34: Trace partitioning superposing up to 100 states [eva] string_h.c:34: Trace partitioning superposing up to 100 states
[eva] computing for function strncat <- test_strncat <- main. [eva] computing for function strncat <- test_strncat <- main.
Called from string_h.c:36. Called from string_h.c:36.
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
[eva] Recording results for test_strncat [eva] Recording results for test_strncat
[eva] Done for function test_strncat [eva] Done for function test_strncat
[eva] computing for function crashes_gcc <- main. [eva] computing for function crashes_gcc <- main.
Called from string_h.c:143. Called from string_h.c:151.
[eva] computing for function strcpy <- crashes_gcc <- main. [eva] computing for function strcpy <- crashes_gcc <- main.
Called from string_h.c:53. Called from string_h.c:53.
[eva] using specification for function strcpy [eva] using specification for function strcpy
...@@ -87,7 +87,7 @@ ...@@ -87,7 +87,7 @@
[eva] Recording results for crashes_gcc [eva] Recording results for crashes_gcc
[eva] Done for function crashes_gcc [eva] Done for function crashes_gcc
[eva] computing for function test_strtok <- main. [eva] computing for function test_strtok <- main.
Called from string_h.c:144. Called from string_h.c:152.
[eva] computing for function strtok <- test_strtok <- main. [eva] computing for function strtok <- test_strtok <- main.
Called from string_h.c:58. Called from string_h.c:58.
[eva] using specification for function strtok [eva] using specification for function strtok
...@@ -148,7 +148,7 @@ ...@@ -148,7 +148,7 @@
[eva] Recording results for test_strtok [eva] Recording results for test_strtok
[eva] Done for function test_strtok [eva] Done for function test_strtok
[eva] computing for function test_strtok_r <- main. [eva] computing for function test_strtok_r <- main.
Called from string_h.c:145. Called from string_h.c:153.
[eva] computing for function strtok_r <- test_strtok_r <- main. [eva] computing for function strtok_r <- test_strtok_r <- main.
Called from string_h.c:82. Called from string_h.c:82.
[eva] using specification for function strtok_r [eva] using specification for function strtok_r
...@@ -233,32 +233,32 @@ ...@@ -233,32 +233,32 @@
[eva] Recording results for test_strtok_r [eva] Recording results for test_strtok_r
[eva] Done for function test_strtok_r [eva] Done for function test_strtok_r
[eva] computing for function strdup <- main. [eva] computing for function strdup <- main.
Called from string_h.c:146. Called from string_h.c:154.
[eva] using specification for function strdup [eva] using specification for function strdup
[eva:libc:unsupported-spec] string_h.c:146: Warning: [eva:libc:unsupported-spec] string_h.c:154: Warning:
The specification of function 'strdup' is currently not supported by Eva. The specification of function 'strdup' is currently not supported by Eva.
Consider adding 'FRAMAC_SHARE/libc/string.c' to the analyzed source files. Consider adding 'FRAMAC_SHARE/libc/string.c' to the analyzed source files.
[eva] string_h.c:146: Warning: ignoring unsupported allocates clause [eva] string_h.c:154: Warning: ignoring unsupported allocates clause
[eva] string_h.c:146: [eva] string_h.c:154:
function strdup: precondition 'valid_string_s' got status valid. function strdup: precondition 'valid_string_s' got status valid.
[eva] Done for function strdup [eva] Done for function strdup
[eva] computing for function strndup <- main. [eva] computing for function strndup <- main.
Called from string_h.c:147. Called from string_h.c:155.
[eva] using specification for function strndup [eva] using specification for function strndup
[eva:libc:unsupported-spec] string_h.c:147: Warning: [eva:libc:unsupported-spec] string_h.c:155: Warning:
The specification of function 'strndup' is currently not supported by Eva. The specification of function 'strndup' is currently not supported by Eva.
Consider adding 'FRAMAC_SHARE/libc/string.c' to the analyzed source files. Consider adding 'FRAMAC_SHARE/libc/string.c' to the analyzed source files.
[eva] string_h.c:147: Warning: ignoring unsupported allocates clause [eva] string_h.c:155: Warning: ignoring unsupported allocates clause
[eva] string_h.c:147: [eva] string_h.c:155:
function strndup: precondition 'valid_string_s' got status valid. function strndup: precondition 'valid_string_s' got status valid.
[eva] Done for function strndup [eva] Done for function strndup
[eva] computing for function strsignal <- main. [eva] computing for function strsignal <- main.
Called from string_h.c:148. Called from string_h.c:156.
[eva] using specification for function strsignal [eva] using specification for function strsignal
[eva] Done for function strsignal [eva] Done for function strsignal
[eva] string_h.c:149: assertion got status valid. [eva] string_h.c:157: assertion got status valid.
[eva] computing for function test_strncpy <- main. [eva] computing for function test_strncpy <- main.
Called from string_h.c:150. Called from string_h.c:158.
[eva] computing for function strncpy <- test_strncpy <- main. [eva] computing for function strncpy <- test_strncpy <- main.
Called from string_h.c:113. Called from string_h.c:113.
[eva] using specification for function strncpy [eva] using specification for function strncpy
...@@ -281,7 +281,7 @@ ...@@ -281,7 +281,7 @@
[eva] Recording results for test_strncpy [eva] Recording results for test_strncpy
[eva] Done for function test_strncpy [eva] Done for function test_strncpy
[eva] computing for function test_strlcpy <- main. [eva] computing for function test_strlcpy <- main.
Called from string_h.c:151. Called from string_h.c:159.
[eva] computing for function strlcpy <- test_strlcpy <- main. [eva] computing for function strlcpy <- test_strlcpy <- main.
Called from string_h.c:126. Called from string_h.c:126.
[eva] using specification for function strlcpy [eva] using specification for function strlcpy
...@@ -322,39 +322,56 @@ ...@@ -322,39 +322,56 @@
[eva] Done for function strlcpy [eva] Done for function strlcpy
[eva] Recording results for test_strlcpy [eva] Recording results for test_strlcpy
[eva] Done for function test_strlcpy [eva] Done for function test_strlcpy
[eva] string_h.c:154: Call to builtin strchr [eva] computing for function test_strrchr <- main.
[eva] string_h.c:154: Called from string_h.c:160.
[eva] computing for function strrchr <- test_strrchr <- main.
Called from string_h.c:139.
[eva] using specification for function strrchr
[eva] string_h.c:139:
function strrchr: precondition 'valid_string_s' got status valid.
[eva] Done for function strrchr
[eva:alarm] string_h.c:140: Warning: check got status unknown.
[eva] computing for function strrchr <- test_strrchr <- main.
Called from string_h.c:141.
[eva] string_h.c:141:
function strrchr: precondition 'valid_string_s' got status valid.
[eva] Done for function strrchr
[eva] string_h.c:142: check got status valid.
[eva] Recording results for test_strrchr
[eva] Done for function test_strrchr
[eva] string_h.c:163: Call to builtin strchr
[eva] string_h.c:163:
function strchr: precondition 'valid_string_s' got status valid. function strchr: precondition 'valid_string_s' got status valid.
[eva] FRAMAC_SHARE/libc/string.h:181: [eva] FRAMAC_SHARE/libc/string.h:181:
cannot evaluate ACSL term, unsupported logic var p cannot evaluate ACSL term, unsupported logic var p
[eva] computing for function strchrnul <- main. [eva] computing for function strchrnul <- main.
Called from string_h.c:155. Called from string_h.c:164.
[eva] using specification for function strchrnul [eva] using specification for function strchrnul
[eva] string_h.c:155: [eva] string_h.c:164:
function strchrnul: precondition 'valid_string_s' got status valid. function strchrnul: precondition 'valid_string_s' got status valid.
[eva] Done for function strchrnul [eva] Done for function strchrnul
[eva] string_h.c:157: Call to builtin strchr [eva] string_h.c:166: Call to builtin strchr
[eva] string_h.c:157: [eva] string_h.c:166:
function strchr: precondition 'valid_string_s' got status valid. function strchr: precondition 'valid_string_s' got status valid.
[eva] computing for function strchrnul <- main. [eva] computing for function strchrnul <- main.
Called from string_h.c:158. Called from string_h.c:167.
[eva] string_h.c:158: [eva] string_h.c:167:
function strchrnul: precondition 'valid_string_s' got status valid. function strchrnul: precondition 'valid_string_s' got status valid.
[eva] Done for function strchrnul [eva] Done for function strchrnul
[eva] computing for function mempcpy <- main. [eva] computing for function mempcpy <- main.
Called from string_h.c:160. Called from string_h.c:169.
[eva] using specification for function mempcpy [eva] using specification for function mempcpy
[eva] string_h.c:160: [eva] string_h.c:169:
function mempcpy: precondition 'valid_dest' got status valid. function mempcpy: precondition 'valid_dest' got status valid.
[eva] string_h.c:160: [eva] string_h.c:169:
function mempcpy: precondition 'valid_src' got status valid. function mempcpy: precondition 'valid_src' got status valid.
[eva] string_h.c:160: [eva] string_h.c:169:
function mempcpy: precondition 'separation' got status valid. function mempcpy: precondition 'separation' got status valid.
[eva] FRAMAC_SHARE/libc/string.h:114: [eva] FRAMAC_SHARE/libc/string.h:114:
cannot evaluate ACSL term, unsupported ACSL construct: logic function memcmp cannot evaluate ACSL term, unsupported ACSL construct: logic function memcmp
[kernel] string_h.c:160: Warning: using size of 'void' [kernel] string_h.c:169: Warning: using size of 'void'
[eva] Done for function mempcpy [eva] Done for function mempcpy
[eva:alarm] string_h.c:161: Warning: assertion 'imprecise' got status unknown. [eva:alarm] string_h.c:170: Warning: assertion 'imprecise' got status unknown.
[eva] Recording results for main [eva] Recording results for main
[eva] Done for function main [eva] Done for function main
[eva] ====== VALUES COMPUTED ====== [eva] ====== VALUES COMPUTED ======
...@@ -393,6 +410,9 @@ ...@@ -393,6 +410,9 @@
src2[0] ∈ {97} src2[0] ∈ {97}
[1] ∈ {98} [1] ∈ {98}
[2] ∈ UNINITIALIZED [2] ∈ UNINITIALIZED
[eva:final-states] Values at end of function test_strrchr:
s1 ∈ {{ "not a palyndrome" }}
p ∈ {0}
[eva:final-states] Values at end of function test_strstr: [eva:final-states] Values at end of function test_strstr:
s ∈ {{ "aba" ; "bab" }} s ∈ {{ "aba" ; "bab" }}
needle ∈ {{ "a" ; "b" }} needle ∈ {{ "a" ; "b" }}
......
...@@ -134,6 +134,14 @@ void test_strlcpy() { ...@@ -134,6 +134,14 @@ void test_strlcpy() {
} }
} }
void test_strrchr() {
const char *s1 = "not a palyndrome";
const char *p = strrchr(s1, 'o');
//@ check p == s1 + strlen(s1) - 2;
p = strrchr(s1, 'Z');
//@ check p == \null;
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
test_strcmp(); test_strcmp();
...@@ -149,6 +157,7 @@ int main(int argc, char **argv) ...@@ -149,6 +157,7 @@ int main(int argc, char **argv)
//@ assert valid_read_string(strsig); //@ assert valid_read_string(strsig);
test_strncpy(); test_strncpy();
test_strlcpy(); test_strlcpy();
test_strrchr();
char *c = "haystack"; char *c = "haystack";
char d = nondet ? 'y' : 'k'; char d = nondet ? 'y' : 'k';
char *chr1 = strchr(c, d); char *chr1 = strchr(c, d);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment