blob: a1a342a253afce969b08f6162b72fd264e7eccfe [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O2 -fconserve-stack -fdump-tree-optimized" } */
/* Check to make sure that if
rfc4106_set_hash_subkey gets split,
the error function does not gets split away
from the if statement conditionalizing it.
Checking this via the scan tree also. */
struct crypto_aes_ctx {
char key_dec[128];
};
int rfc4106_set_hash_subkey_hash_subkey;
void __write_overflow(void)__attribute__((__error__("")));
void __write_overflow1(void);
void aes_encrypt(void*);
void fortify_panic(const char*) __attribute__((__noreturn__)) ;
char *rfc4106_set_hash_subkey(struct crypto_aes_ctx *ctx) {
void *a = &ctx->key_dec[0];
unsigned p_size = __builtin_object_size(a, 0);
#ifdef __OPTIMIZE__
if (p_size < 16) {
__write_overflow1();
fortify_panic(__func__);
}
if (p_size < 32) {
__write_overflow();
fortify_panic(__func__);
}
#endif
aes_encrypt(ctx);
return ctx->key_dec;
}
char *(*gg)(struct crypto_aes_ctx *) = rfc4106_set_hash_subkey;
void a(void)
{
struct crypto_aes_ctx ctx;
rfc4106_set_hash_subkey(&ctx);
}
void b(void)
{
struct crypto_aes_ctx ctx;
ctx.key_dec[0] = 0;
rfc4106_set_hash_subkey(&ctx);
}
/* This testcase should still split out one of the above basic blocks dealing
with __write_overflow. */
/* { dg-final { scan-tree-dump-times "Function rfc4106_set_hash_subkey.part" 1 "optimized" } } */