diff --git a/tests/basic/oracle/placement_new.err.oracle b/tests/basic/oracle/placement_new.err.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0a7cae45d12ab222537daff8e31eb5653cce4750
--- /dev/null
+++ b/tests/basic/oracle/placement_new.err.oracle
@@ -0,0 +1 @@
+FRAMAC_SHARE/libc/stdlib.h:804:19: the body of the post-condition is not a predicate
diff --git a/tests/basic/oracle/placement_new.res.oracle b/tests/basic/oracle/placement_new.res.oracle
index 7e1a1b5555b633a20a637213b53ad36e2e995df5..f1b04d623fa5c7f00e8f7210ae4d1eca0840fd43 100644
--- a/tests/basic/oracle/placement_new.res.oracle
+++ b/tests/basic/oracle/placement_new.res.oracle
@@ -412,6 +412,9 @@ predicate valid_read_nwstring{L}(wchar_t *s, ℤ n) =
 predicate valid_wstring_or_null{L}(wchar_t *s) =
   s ≡ \null ∨ valid_wstring(s);
  */
+int __fc_errno;
+char *program_invocation_name;
+char *program_invocation_short_name;
 /*@ requires valid_nptr: \valid_read(nptr);
     assigns \result;
     assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
@@ -1157,6 +1160,78 @@ int mkstemp(char *templat);
  */
 int mkstemps(char *templat, int suffixlen);
 
+/*@ requires
+      valid_file_name_or_null:
+        file_name ≡ \null ∨ valid_read_string(file_name);
+    requires
+      resolved_name_null_or_allocated:
+        resolved_name ≡ \null ∨ \valid(resolved_name + (0 .. 4096 - 1));
+    assigns __fc_heap_status, *(\result + (0 .. 4096 - 1)),
+            *(resolved_name + (0 .. 4096 - 1)), __fc_errno;
+    assigns __fc_heap_status
+      \from (indirect: resolved_name), __fc_heap_status;
+    assigns *(\result + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns *(resolved_name + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns __fc_errno
+      \from (indirect: file_name), (indirect: *(file_name + (0 ..))),
+            (indirect: resolved_name), (indirect: __fc_heap_status);
+    
+    behavior null_file_name:
+      assumes null_file_name: file_name ≡ \null;
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 22;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: file_name);
+      assigns __fc_errno \from (indirect: file_name);
+    
+    behavior allocate_resolved_name:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes can_allocate: is_allocable(4096);
+      ensures allocation: \fresh{Old, Here}(\result,4096);
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from __fc_heap_status;
+      assigns \result \from (indirect: __fc_heap_status);
+    
+    behavior not_enough_memory:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes cannot_allocate: ¬is_allocable(4096);
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 12;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    behavior resolved_name_buffer:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes
+        allocated_resolved_name_or_fail:
+          \valid(resolved_name + (0 .. 4096 - 1));
+      ensures
+        valid_string_resolved_name:
+          valid_string(\old(resolved_name)) ∧
+          strlen(\old(resolved_name)) < 4096;
+      ensures resolved_result: \result ≡ \old(resolved_name);
+      assigns \result, *(resolved_name + (0 .. 4096 - 1));
+      assigns \result \from resolved_name;
+      assigns *(resolved_name + (0 .. 4096 - 1))
+        \from (indirect: *(file_name + (0 ..)));
+      allocates \nothing;
+    
+    behavior filesystem_error:
+      assumes valid_file_name: valid_read_string(file_name);
+      ensures null_result: \result ≡ \null;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: *(file_name + (0 ..)));
+      assigns __fc_errno \from (indirect: *(file_name + (0 ..)));
+ */
+char *realpath(char const * restrict file_name, char * restrict resolved_name);
+
 struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info;
 
 /*@ requires \valid_read(this); */
diff --git a/tests/basic/oracle/placement_newb.err.oracle b/tests/basic/oracle/placement_newb.err.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0a7cae45d12ab222537daff8e31eb5653cce4750
--- /dev/null
+++ b/tests/basic/oracle/placement_newb.err.oracle
@@ -0,0 +1 @@
+FRAMAC_SHARE/libc/stdlib.h:804:19: the body of the post-condition is not a predicate
diff --git a/tests/basic/oracle/placement_newb.res.oracle b/tests/basic/oracle/placement_newb.res.oracle
index 9a45df60bf414465446e3b3f8936b0cc0f519fdb..39905324945b67e7a479d3a95f3402e34b818e47 100644
--- a/tests/basic/oracle/placement_newb.res.oracle
+++ b/tests/basic/oracle/placement_newb.res.oracle
@@ -381,6 +381,9 @@ predicate valid_read_nwstring{L}(wchar_t *s, ℤ n) =
 predicate valid_wstring_or_null{L}(wchar_t *s) =
   s ≡ \null ∨ valid_wstring(s);
  */
+int __fc_errno;
+char *program_invocation_name;
+char *program_invocation_short_name;
 /*@ requires valid_nptr: \valid_read(nptr);
     assigns \result;
     assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
@@ -1126,4 +1129,76 @@ int mkstemp(char *templat);
  */
 int mkstemps(char *templat, int suffixlen);
 
+/*@ requires
+      valid_file_name_or_null:
+        file_name ≡ \null ∨ valid_read_string(file_name);
+    requires
+      resolved_name_null_or_allocated:
+        resolved_name ≡ \null ∨ \valid(resolved_name + (0 .. 4096 - 1));
+    assigns __fc_heap_status, *(\result + (0 .. 4096 - 1)),
+            *(resolved_name + (0 .. 4096 - 1)), __fc_errno;
+    assigns __fc_heap_status
+      \from (indirect: resolved_name), __fc_heap_status;
+    assigns *(\result + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns *(resolved_name + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns __fc_errno
+      \from (indirect: file_name), (indirect: *(file_name + (0 ..))),
+            (indirect: resolved_name), (indirect: __fc_heap_status);
+    
+    behavior null_file_name:
+      assumes null_file_name: file_name ≡ \null;
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 22;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: file_name);
+      assigns __fc_errno \from (indirect: file_name);
+    
+    behavior allocate_resolved_name:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes can_allocate: is_allocable(4096);
+      ensures allocation: \fresh{Old, Here}(\result,4096);
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from __fc_heap_status;
+      assigns \result \from (indirect: __fc_heap_status);
+    
+    behavior not_enough_memory:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes cannot_allocate: ¬is_allocable(4096);
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 12;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    behavior resolved_name_buffer:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes
+        allocated_resolved_name_or_fail:
+          \valid(resolved_name + (0 .. 4096 - 1));
+      ensures
+        valid_string_resolved_name:
+          valid_string(\old(resolved_name)) ∧
+          strlen(\old(resolved_name)) < 4096;
+      ensures resolved_result: \result ≡ \old(resolved_name);
+      assigns \result, *(resolved_name + (0 .. 4096 - 1));
+      assigns \result \from resolved_name;
+      assigns *(resolved_name + (0 .. 4096 - 1))
+        \from (indirect: *(file_name + (0 ..)));
+      allocates \nothing;
+    
+    behavior filesystem_error:
+      assumes valid_file_name: valid_read_string(file_name);
+      ensures null_result: \result ≡ \null;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: *(file_name + (0 ..)));
+      assigns __fc_errno \from (indirect: *(file_name + (0 ..)));
+ */
+char *realpath(char const * restrict file_name, char * restrict resolved_name);
+
 
diff --git a/tests/stl/oracle/stl_shared_ptr_mistake10.err.oracle b/tests/stl/oracle/stl_shared_ptr_mistake10.err.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0a7cae45d12ab222537daff8e31eb5653cce4750
--- /dev/null
+++ b/tests/stl/oracle/stl_shared_ptr_mistake10.err.oracle
@@ -0,0 +1 @@
+FRAMAC_SHARE/libc/stdlib.h:804:19: the body of the post-condition is not a predicate
diff --git a/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle b/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle
index 769ed4ab3a1da2b8bc8a5cac2e56d358ff028386..a98a8a7ee933cf7004e23ca2d8ffffd77c740ac6 100644
--- a/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle
+++ b/tests/stl/oracle/stl_shared_ptr_mistake10.res.oracle
@@ -2508,6 +2508,9 @@ struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info =
    .base_classes = (struct _frama_c_rtti_name_info_content *)0,
    .number_of_base_classes = 0,
    .pvmt = (struct _frama_c_vmt *)0};
+int __fc_errno;
+char *program_invocation_name;
+char *program_invocation_short_name;
 /*@ requires valid_nptr: \valid_read(nptr);
     assigns \result;
     assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
@@ -3253,6 +3256,78 @@ int mkstemp(char *templat);
  */
 int mkstemps(char *templat, int suffixlen);
 
+/*@ requires
+      valid_file_name_or_null:
+        file_name ≡ \null ∨ valid_read_string(file_name);
+    requires
+      resolved_name_null_or_allocated:
+        resolved_name ≡ \null ∨ \valid(resolved_name + (0 .. 4096 - 1));
+    assigns __fc_heap_status, *(\result + (0 .. 4096 - 1)),
+            *(resolved_name + (0 .. 4096 - 1)), __fc_errno;
+    assigns __fc_heap_status
+      \from (indirect: resolved_name), __fc_heap_status;
+    assigns *(\result + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns *(resolved_name + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns __fc_errno
+      \from (indirect: file_name), (indirect: *(file_name + (0 ..))),
+            (indirect: resolved_name), (indirect: __fc_heap_status);
+    
+    behavior null_file_name:
+      assumes null_file_name: file_name ≡ \null;
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 22;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: file_name);
+      assigns __fc_errno \from (indirect: file_name);
+    
+    behavior allocate_resolved_name:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes can_allocate: is_allocable(4096);
+      ensures allocation: \fresh{Old, Here}(\result,4096);
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from __fc_heap_status;
+      assigns \result \from (indirect: __fc_heap_status);
+    
+    behavior not_enough_memory:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes cannot_allocate: ¬is_allocable(4096);
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 12;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    behavior resolved_name_buffer:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes
+        allocated_resolved_name_or_fail:
+          \valid(resolved_name + (0 .. 4096 - 1));
+      ensures
+        valid_string_resolved_name:
+          valid_string(\old(resolved_name)) ∧
+          strlen(\old(resolved_name)) < 4096;
+      ensures resolved_result: \result ≡ \old(resolved_name);
+      assigns \result, *(resolved_name + (0 .. 4096 - 1));
+      assigns \result \from resolved_name;
+      assigns *(resolved_name + (0 .. 4096 - 1))
+        \from (indirect: *(file_name + (0 ..)));
+      allocates \nothing;
+    
+    behavior filesystem_error:
+      assumes valid_file_name: valid_read_string(file_name);
+      ensures null_result: \result ≡ \null;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: *(file_name + (0 ..)));
+      assigns __fc_errno \from (indirect: *(file_name + (0 ..)));
+ */
+char *realpath(char const * restrict file_name, char * restrict resolved_name);
+
 struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info;
 
 /*@ requires \valid(this); */
diff --git a/tests/stl/oracle/stl_shared_ptr_mistake5.err.oracle b/tests/stl/oracle/stl_shared_ptr_mistake5.err.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0a7cae45d12ab222537daff8e31eb5653cce4750
--- /dev/null
+++ b/tests/stl/oracle/stl_shared_ptr_mistake5.err.oracle
@@ -0,0 +1 @@
+FRAMAC_SHARE/libc/stdlib.h:804:19: the body of the post-condition is not a predicate
diff --git a/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle b/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle
index 7787be6ba39f85775f88784540c6d6a84729b522..540339c4f0a55df8fe56f23c5f13015f186b4f66 100644
--- a/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle
+++ b/tests/stl/oracle/stl_shared_ptr_mistake5.res.oracle
@@ -2287,6 +2287,9 @@ struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info =
    .base_classes = (struct _frama_c_rtti_name_info_content *)0,
    .number_of_base_classes = 0,
    .pvmt = (struct _frama_c_vmt *)0};
+int __fc_errno;
+char *program_invocation_name;
+char *program_invocation_short_name;
 /*@ requires valid_nptr: \valid_read(nptr);
     assigns \result;
     assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
@@ -3032,6 +3035,78 @@ int mkstemp(char *templat);
  */
 int mkstemps(char *templat, int suffixlen);
 
+/*@ requires
+      valid_file_name_or_null:
+        file_name ≡ \null ∨ valid_read_string(file_name);
+    requires
+      resolved_name_null_or_allocated:
+        resolved_name ≡ \null ∨ \valid(resolved_name + (0 .. 4096 - 1));
+    assigns __fc_heap_status, *(\result + (0 .. 4096 - 1)),
+            *(resolved_name + (0 .. 4096 - 1)), __fc_errno;
+    assigns __fc_heap_status
+      \from (indirect: resolved_name), __fc_heap_status;
+    assigns *(\result + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns *(resolved_name + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns __fc_errno
+      \from (indirect: file_name), (indirect: *(file_name + (0 ..))),
+            (indirect: resolved_name), (indirect: __fc_heap_status);
+    
+    behavior null_file_name:
+      assumes null_file_name: file_name ≡ \null;
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 22;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: file_name);
+      assigns __fc_errno \from (indirect: file_name);
+    
+    behavior allocate_resolved_name:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes can_allocate: is_allocable(4096);
+      ensures allocation: \fresh{Old, Here}(\result,4096);
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from __fc_heap_status;
+      assigns \result \from (indirect: __fc_heap_status);
+    
+    behavior not_enough_memory:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes cannot_allocate: ¬is_allocable(4096);
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 12;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    behavior resolved_name_buffer:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes
+        allocated_resolved_name_or_fail:
+          \valid(resolved_name + (0 .. 4096 - 1));
+      ensures
+        valid_string_resolved_name:
+          valid_string(\old(resolved_name)) ∧
+          strlen(\old(resolved_name)) < 4096;
+      ensures resolved_result: \result ≡ \old(resolved_name);
+      assigns \result, *(resolved_name + (0 .. 4096 - 1));
+      assigns \result \from resolved_name;
+      assigns *(resolved_name + (0 .. 4096 - 1))
+        \from (indirect: *(file_name + (0 ..)));
+      allocates \nothing;
+    
+    behavior filesystem_error:
+      assumes valid_file_name: valid_read_string(file_name);
+      ensures null_result: \result ≡ \null;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: *(file_name + (0 ..)));
+      assigns __fc_errno \from (indirect: *(file_name + (0 ..)));
+ */
+char *realpath(char const * restrict file_name, char * restrict resolved_name);
+
 struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info;
 
 /*@ requires \valid(this); */
diff --git a/tests/stl/oracle/stl_shared_ptr_mistake6.err.oracle b/tests/stl/oracle/stl_shared_ptr_mistake6.err.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..0a7cae45d12ab222537daff8e31eb5653cce4750
--- /dev/null
+++ b/tests/stl/oracle/stl_shared_ptr_mistake6.err.oracle
@@ -0,0 +1 @@
+FRAMAC_SHARE/libc/stdlib.h:804:19: the body of the post-condition is not a predicate
diff --git a/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle b/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle
index e86ef322294f9b0b67701a27aec44f440580f4f2..474773e28a369a709cfe378de0e8b785feba86f0 100644
--- a/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle
+++ b/tests/stl/oracle/stl_shared_ptr_mistake6.res.oracle
@@ -2293,6 +2293,9 @@ struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info =
    .base_classes = (struct _frama_c_rtti_name_info_content *)0,
    .number_of_base_classes = 0,
    .pvmt = (struct _frama_c_vmt *)0};
+int __fc_errno;
+char *program_invocation_name;
+char *program_invocation_short_name;
 /*@ requires valid_nptr: \valid_read(nptr);
     assigns \result;
     assigns \result \from (indirect: nptr), (indirect: *(nptr + (0 ..)));
@@ -3038,6 +3041,78 @@ int mkstemp(char *templat);
  */
 int mkstemps(char *templat, int suffixlen);
 
+/*@ requires
+      valid_file_name_or_null:
+        file_name ≡ \null ∨ valid_read_string(file_name);
+    requires
+      resolved_name_null_or_allocated:
+        resolved_name ≡ \null ∨ \valid(resolved_name + (0 .. 4096 - 1));
+    assigns __fc_heap_status, *(\result + (0 .. 4096 - 1)),
+            *(resolved_name + (0 .. 4096 - 1)), __fc_errno;
+    assigns __fc_heap_status
+      \from (indirect: resolved_name), __fc_heap_status;
+    assigns *(\result + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns *(resolved_name + (0 .. 4096 - 1))
+      \from (indirect: __fc_heap_status), (indirect: resolved_name),
+            (indirect: *(file_name + (0 ..)));
+    assigns __fc_errno
+      \from (indirect: file_name), (indirect: *(file_name + (0 ..))),
+            (indirect: resolved_name), (indirect: __fc_heap_status);
+    
+    behavior null_file_name:
+      assumes null_file_name: file_name ≡ \null;
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 22;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: file_name);
+      assigns __fc_errno \from (indirect: file_name);
+    
+    behavior allocate_resolved_name:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes can_allocate: is_allocable(4096);
+      ensures allocation: \fresh{Old, Here}(\result,4096);
+      assigns __fc_heap_status, \result;
+      assigns __fc_heap_status \from __fc_heap_status;
+      assigns \result \from (indirect: __fc_heap_status);
+    
+    behavior not_enough_memory:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes resolved_name_null: resolved_name ≡ \null;
+      assumes cannot_allocate: ¬is_allocable(4096);
+      ensures null_result: \result ≡ \null;
+      ensures errno_set: __fc_errno ≡ 12;
+      assigns \result;
+      assigns \result \from \nothing;
+      allocates \nothing;
+    
+    behavior resolved_name_buffer:
+      assumes valid_file_name: valid_read_string(file_name);
+      assumes
+        allocated_resolved_name_or_fail:
+          \valid(resolved_name + (0 .. 4096 - 1));
+      ensures
+        valid_string_resolved_name:
+          valid_string(\old(resolved_name)) ∧
+          strlen(\old(resolved_name)) < 4096;
+      ensures resolved_result: \result ≡ \old(resolved_name);
+      assigns \result, *(resolved_name + (0 .. 4096 - 1));
+      assigns \result \from resolved_name;
+      assigns *(resolved_name + (0 .. 4096 - 1))
+        \from (indirect: *(file_name + (0 ..)));
+      allocates \nothing;
+    
+    behavior filesystem_error:
+      assumes valid_file_name: valid_read_string(file_name);
+      ensures null_result: \result ≡ \null;
+      assigns \result, __fc_errno;
+      assigns \result \from (indirect: *(file_name + (0 ..)));
+      assigns __fc_errno \from (indirect: *(file_name + (0 ..)));
+ */
+char *realpath(char const * restrict file_name, char * restrict resolved_name);
+
 struct _frama_c_rtti_name_info_node _frama_c_rtti_name_info;
 
 /*@ requires \valid(this); */