On Sun, 3 Aug 2025 at 23:27, Denys Vlasenko <vda.li...@googlemail.com> wrote:
>
> On Sun, Aug 3, 2025 at 9:33 PM Harry Eaton <bump...@gmail.com> wrote:

[...]

> > The other leak is difficult to explain "exactly". It mostly doesn't happen 
> > on a system with a real MMU, but it happens reliably on my actual target 
> > which has only 1 processor and no MMU. If you run the new hunt_leaktool.sh 
> > on the attached "output.on_target.txt" it will show the leak. If you look 
> > carefully at the output file, the free() is happening, but it is always 0, 
> > so it doesn't free anything.
>
> I reproduced it. It's overzealous optimization. gcc just doesn't store
> the pointer into *to_free,
> because it can see that in all callers of the static function where
> the store is done, the address
> points to a local (on-stack) variable, therefore this variable is not
> visible to any other thread,
> and also the store can't alias with any global variables. And we are
> in a NORETURN function,
> so gcc can see the entire execution path until the program "ends"
> So, the store looks "dead" to gcc and it eliminates it.
>
> I discovered this when an added debugging statement took the address
> of the variable and passed
> it to a printf. The conclusion that the store is "dead" become invalid
> and the leak disappeared
> (gcc no longer eliminated the store).

Therefore a free() instead of a printf() that calls such a pointer
variable, solves both the problems at once: free it, and call it into
the scope avoiding the gcc over-optimisation. Right? ;-)

Best regards, R-
_______________________________________________
busybox mailing list
busybox@busybox.net
https://lists.busybox.net/mailman/listinfo/busybox

Reply via email to