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>
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)
{
--- /dev/null
+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);
+}