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.
Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r16-7708-gf8380ded1f64c2.
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 <[email protected]>
---
gcc/analyzer/kf.cc | 2 +-
gcc/testsuite/gcc.dg/analyzer/putenv-ice-pr124232.c | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.dg/analyzer/putenv-ice-pr124232.c
diff --git a/gcc/analyzer/kf.cc b/gcc/analyzer/kf.cc
index 82aaee1dcb581..b1ccbd6584aeb 100644
--- a/gcc/analyzer/kf.cc
+++ b/gcc/analyzer/kf.cc
@@ -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
index 0000000000000..d018180ed2dd2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/analyzer/putenv-ice-pr124232.c
@@ -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);
+}
--
2.26.3