AIM FOR TODAY: 

- Add custom edge info to the eedges created for dynamically discovered calls
- Add the custom events to be showing in diagnostics
- update call_event and return_event to also work for the cases where there is 
no underlying superedge representing the call

---
PROGRESS  :

- I created "dynamic_call_info_t" subclass reprsenting custom info on the edge 
representing the dynamically discovered calls 

- I overloaded it's "add_events_to_path ()" function to add call and return 
event to checkers path

- Now call_event and return_event subclasses mostly make use of the underlying 
interprocedural superedge representing the call to work properly. To tackle 
this problem, I used the same method I used for callstring patch earlier 
working with src and dest supernodes instead of superedge )

- The call_event subclass (and same applies to return_event subclass also) now 
have 2 additional pointers to source and destination supernodes representing 
the call in absense of a superedge. 

- I have also tweeked a few more things to make it work, I think the best way 
to show them all is to attach a patch ( it should be attached with this mail ) 
for just the changes I did today for better understanding on what exactly have 
I changed since last update. ( this patch would be squashed in previous one 
before the final review ).

- After all the changes done, now the analyzer emmits the following error 
message for the test program ( godbolt link https://godbolt.org/z/Td8n4c9a6 
<https://godbolt.org/z/Td8n4c9a6> ), which I think now emmits all the events it 
was missing before.

```
test.c: In function ‘fun’:
test.c:6:9: warning: double-‘free’ of ‘int_ptr’ [CWE-415] 
[-Wanalyzer-double-free]
    6 |         free(int_ptr);
      |         ^~~~~~~~~~~~~
  ‘double_call’: events 1-3
    |
    |   16 | void double_call()
    |      |      ^~~~~~~~~~~
    |      |      |
    |      |      (1) entry to ‘double_call’
    |   17 | {
    |   18 |         int *int_ptr = (int*)malloc(sizeof(int));
    |      |                              ~~~~~~~~~~~~~~~~~~~
    |      |                              |
    |      |                              (2) allocated here
    |   19 |         void (*fun_ptr)(int *) = &fun;
    |   20 |         (*fun_ptr)(int_ptr);
    |      |         ~~~~~~~~~~~~~~~~~~~
    |      |          |
    |      |          (3) calling ‘fun’ from ‘double_call’
    |
    +--> ‘fun’: events 4-5
           |
           |    4 | void fun(int *int_ptr)
           |      |      ^~~
           |      |      |
           |      |      (4) entry to ‘fun’
           |    5 | {
           |    6 |         free(int_ptr);
           |      |         ~~~~~~~~~~~~~
           |      |         |
           |      |         (5) first ‘free’ here
           |
    <------+
    |
  ‘double_call’: events 6-7
    |
    |   20 |         (*fun_ptr)(int_ptr);
    |      |         ~^~~~~~~~~~~~~~~~~~
    |      |          |
    |      |          (6) returning to ‘double_call’ from ‘fun’
    |   21 |         (*fun_ptr)(int_ptr);
    |      |         ~~~~~~~~~~~~~~~~~~~
    |      |          |
    |      |          (7) calling ‘fun’ from ‘double_call’
    |
    +--> ‘fun’: events 8-9
           |
           |    4 | void fun(int *int_ptr)
           |      |      ^~~
           |      |      |
           |      |      (8) entry to ‘fun’
           |    5 | {
           |    6 |         free(int_ptr);
           |      |         ~~~~~~~~~~~~~
           |      |         |
           |      |         (9) second ‘free’ here; first ‘free’ was at (5)
           |
```

---
STATUS AT THE END OF THE DAY :- 

- Add custom edge info to the eedges created for dynamically discovered calls 
(done )
- Add the custom events to be showing in diagnostics (done)
- update call_event and return_event to also work for the cases where there is 
no underlying superedge representing the call (done)

--- 
Question / doubt :- 

- In "case EK_RETURN_EDGE” of "diagnostic_manager::prune_for_sm_diagnostic ()” 
function. 

File:{source_dir}/gcc/analyzer/diagnostic-manager.cc
2105:                   log ("event %i:"
2106:                        " recording critical state for %qs at return"
2107:                        " from %qE in caller to %qE in callee",
2108:                        idx, sval_desc.m_buffer, callee_var, callee_var);

shouldn’t it be 

2107:                        " from %qE in caller to %qE in callee",
2108:                        idx, sval_desc.m_buffer, caller_var, callee_var);

and get value of caller_var before ? will they always be same ?

---
Patch representing changes done today :-



Thank you
- Ankur

Reply via email to