glider created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Initially concerns have been raised that -ftrivial-auto-var-init=zero potentially defines a new dialect of C++, therefore this option was guarded with -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang. The guard flag name suggests that at some point -ftrivial-auto-var-init=pattern will perform on par with -ftrivial-auto-var-init=zero, thus making it possible to remove the latter from Clang. However this isn't going to happen in the nearest future, at least not on X86, where `memset(object, 0, size)` is still lowered to a more efficient code than `memset(object, 0xAA, size)`. Therefore security-minded people may still need an easy way to zero-initialize all the locals to keep the performance penalty low. For Linux kernel, which already uses a non-standard dialect of C, introducing yet another hardening feature doesn't radically change the situation. Other C codebases also tend to use non-standard features more often, so the mentioned guard flag only complicates the adoption of auto-initialization for them, not actually protecting their purity. As a compromise solution, let -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang remain mandatory for -ftrivial-auto-var-init=zero in C++ mode and make it optional in the C mode. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D64742 Files: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/clang_f_opts.c Index: clang/test/Driver/clang_f_opts.c =================================================================== --- clang/test/Driver/clang_f_opts.c +++ clang/test/Driver/clang_f_opts.c @@ -566,7 +566,10 @@ // RUN: %clang -### -S -ftrivial-auto-var-init=uninitialized %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-UNINIT %s // RUN: %clang -### -S -ftrivial-auto-var-init=pattern %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-PATTERN %s // RUN: %clang -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s -// RUN: %clang -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-BAD %s +// RUN: %clang -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s +// RUN: %clangxx -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s +// RUN: %clangxx -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-BAD %s + // CHECK-TRIVIAL-UNINIT-NOT: hasn't been enabled // CHECK-TRIVIAL-PATTERN-NOT: hasn't been enabled // CHECK-TRIVIAL-ZERO-GOOD-NOT: hasn't been enabled Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -2544,7 +2544,8 @@ static void RenderTrivialAutoVarInitOptions(const Driver &D, const ToolChain &TC, const ArgList &Args, - ArgStringList &CmdArgs) { + ArgStringList &CmdArgs, + const InputInfo &Input) { auto DefaultTrivialAutoVarInit = TC.GetDefaultTrivialAutoVarInit(); StringRef TrivialAutoVarInit = ""; @@ -2578,7 +2579,9 @@ } if (!TrivialAutoVarInit.empty()) { - if (TrivialAutoVarInit == "zero" && !Args.hasArg(options::OPT_enable_trivial_var_init_zero)) + if (TrivialAutoVarInit == "zero" && + !Args.hasArg(options::OPT_enable_trivial_var_init_zero) && + (Input.getType() != types::TY_C)) D.Diag(diag::err_drv_trivial_auto_var_init_zero_disabled); CmdArgs.push_back( Args.MakeArgString("-ftrivial-auto-var-init=" + TrivialAutoVarInit)); @@ -4623,7 +4626,7 @@ CmdArgs.push_back(Args.MakeArgString("-mspeculative-load-hardening")); RenderSSPOptions(TC, Args, CmdArgs, KernelOrKext); - RenderTrivialAutoVarInitOptions(D, TC, Args, CmdArgs); + RenderTrivialAutoVarInitOptions(D, TC, Args, CmdArgs, Input); // Translate -mstackrealign if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Index: clang/test/Driver/clang_f_opts.c =================================================================== --- clang/test/Driver/clang_f_opts.c +++ clang/test/Driver/clang_f_opts.c @@ -566,7 +566,10 @@ // RUN: %clang -### -S -ftrivial-auto-var-init=uninitialized %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-UNINIT %s // RUN: %clang -### -S -ftrivial-auto-var-init=pattern %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-PATTERN %s // RUN: %clang -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s -// RUN: %clang -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-BAD %s +// RUN: %clang -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s +// RUN: %clangxx -### -S -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-GOOD %s +// RUN: %clangxx -### -S -ftrivial-auto-var-init=zero %s 2>&1 | FileCheck -check-prefix=CHECK-TRIVIAL-ZERO-BAD %s + // CHECK-TRIVIAL-UNINIT-NOT: hasn't been enabled // CHECK-TRIVIAL-PATTERN-NOT: hasn't been enabled // CHECK-TRIVIAL-ZERO-GOOD-NOT: hasn't been enabled Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -2544,7 +2544,8 @@ static void RenderTrivialAutoVarInitOptions(const Driver &D, const ToolChain &TC, const ArgList &Args, - ArgStringList &CmdArgs) { + ArgStringList &CmdArgs, + const InputInfo &Input) { auto DefaultTrivialAutoVarInit = TC.GetDefaultTrivialAutoVarInit(); StringRef TrivialAutoVarInit = ""; @@ -2578,7 +2579,9 @@ } if (!TrivialAutoVarInit.empty()) { - if (TrivialAutoVarInit == "zero" && !Args.hasArg(options::OPT_enable_trivial_var_init_zero)) + if (TrivialAutoVarInit == "zero" && + !Args.hasArg(options::OPT_enable_trivial_var_init_zero) && + (Input.getType() != types::TY_C)) D.Diag(diag::err_drv_trivial_auto_var_init_zero_disabled); CmdArgs.push_back( Args.MakeArgString("-ftrivial-auto-var-init=" + TrivialAutoVarInit)); @@ -4623,7 +4626,7 @@ CmdArgs.push_back(Args.MakeArgString("-mspeculative-load-hardening")); RenderSSPOptions(TC, Args, CmdArgs, KernelOrKext); - RenderTrivialAutoVarInitOptions(D, TC, Args, CmdArgs); + RenderTrivialAutoVarInitOptions(D, TC, Args, CmdArgs, Input); // Translate -mstackrealign if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits