IPA ICF + ASAN: do not merge vars with different alignment

gcc/ChangeLog:

	PR sanitizer/99168
	* ipa-icf.c (sem_variable::merge): Do not merge 2 variables
	with different alignment. That leads to an invalid red zone
	size allocated in runtime.

gcc/testsuite/ChangeLog:

	PR sanitizer/99168
	* c-c++-common/asan/pr99168.c: New test.
This commit is contained in:
Martin Liska 2021-02-23 09:01:53 +01:00
parent 5bd7afb71f
commit 3f83845457
2 changed files with 39 additions and 0 deletions

View File

@ -88,6 +88,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-vector-builder.h"
#include "symtab-thunks.h"
#include "alias.h"
#include "asan.h"
using namespace ipa_icf_gimple;
@ -2022,6 +2023,18 @@ sem_variable::merge (sem_item *alias_item)
return false;
}
if (DECL_ALIGN (original->decl) != DECL_ALIGN (alias->decl)
&& (sanitize_flags_p (SANITIZE_ADDRESS, original->decl)
|| sanitize_flags_p (SANITIZE_ADDRESS, alias->decl)))
{
if (dump_enabled_p ())
dump_printf (MSG_MISSED_OPTIMIZATION,
"Not unifying; "
"ASAN requires equal alignments for original and alias\n");
return false;
}
if (DECL_ALIGN (original->decl) < DECL_ALIGN (alias->decl))
{
if (dump_enabled_p ())

View File

@ -0,0 +1,26 @@
/* PR sanitizer/99168 */
/* { dg-do run } */
struct my_struct
{
unsigned long volatile x;
} __attribute__((aligned(128)));
static int variablek[5][6] = {};
static struct my_struct variables1 = {0UL};
static struct my_struct variables2 __attribute__((aligned(32))) = {0UL};
int main() {
int i, j;
for (i = 0; i < 5; i++) {
for (j = 0; j < 6; j++) {
__builtin_printf("%d ", variablek[i][j]);
}
}
__builtin_printf("\n");
__builtin_printf("%lu\n", variables1.x);
__builtin_printf("%lu\n", variables2.x);
return 0;
}