Package: cppcheck
Version: 1.90-4
Severity: normal

Hi!

There's a false positive about double free()s after a non-returning
function pointer, even if that contains an explicit exit() or is
marked with a __noreturn__ attribute.

Attached a test case.

Thanks,
Guillem
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>


static void
__attribute__((__noreturn__))
error(void)
{
	exit(1);
}

void __attribute__((__noreturn__)) (*func_notret)(void);

int
main(int argc)
{
	func_notret = error;
	void *ptr;

	ptr = malloc(1000);

	if (argc == 1) {
		free(ptr);
		func_notret();
	}

	if (argc == 2) {
		free(ptr);
		func_notret();
	}

	free(ptr);

	return 0;
}

Reply via email to