]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
analyzer: fix ICE on putenv of a field [PR124232]
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 26 Feb 2026 02:50:58 +0000 (21:50 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Thu, 26 Feb 2026 02:50:58 +0000 (21:50 -0500)
store::mark_as_escaped requires the region passed in to be a base
region, but the analyzer's implementation of putenv wasn't respecting
that.

Fixed thusly.

gcc/analyzer/ChangeLog:
PR analyzer/124232
* kf.cc (kf_putenv::impl_call_pre): Use base region when marking
pointer as having escaped.

gcc/testsuite/ChangeLog:
PR analyzer/124232
* gcc.dg/analyzer/putenv-ice-pr124232.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/analyzer/kf.cc
gcc/testsuite/gcc.dg/analyzer/putenv-ice-pr124232.c [new file with mode: 0644]

index 82aaee1dcb58180403bbb98df161d0265d3a2c87..b1ccbd6584aeb569071e1692ae312a01e28a0401 100644 (file)
@@ -858,7 +858,7 @@ public:
     const region *reg
       = model->deref_rvalue (ptr_sval, cd.get_arg_tree (0), ctxt);
     store_manager *store_mgr = model->get_manager ()->get_store_manager ();
-    model->get_store ()->mark_as_escaped (*store_mgr, reg);
+    model->get_store ()->mark_as_escaped (*store_mgr, reg->get_base_region ());
     enum memory_space mem_space = reg->get_memory_space ();
     switch (mem_space)
       {
diff --git a/gcc/testsuite/gcc.dg/analyzer/putenv-ice-pr124232.c b/gcc/testsuite/gcc.dg/analyzer/putenv-ice-pr124232.c
new file mode 100644 (file)
index 0000000..d018180
--- /dev/null
@@ -0,0 +1,10 @@
+extern int putenv (char *__string)
+  __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__nonnull__ (1)));
+
+struct {
+  char s[16];
+} e = { "a=b" };
+
+int main(int, char *[]) {
+  return putenv(e.s);
+}