2018-04-12 17:30:59

by Andrey Konovalov

[permalink] [raw]
Subject: [PATCH] kasan: add no_sanitize attribute for clang builds

KASAN uses the __no_sanitize_address macro to disable instrumentation
of particular functions. Right now it's defined only for GCC build,
which causes false positives when clang is used.

This patch adds a definition for clang.

Note, that clang's revision 329612 or higher is required.

Signed-off-by: Andrey Konovalov <[email protected]>
---
include/linux/compiler-clang.h | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
index ceb96ecab96e..5a1d8580febe 100644
--- a/include/linux/compiler-clang.h
+++ b/include/linux/compiler-clang.h
@@ -25,6 +25,11 @@
#define __SANITIZE_ADDRESS__
#endif

+#ifdef CONFIG_KASAN
+#undef __no_sanitize_address
+#define __no_sanitize_address __attribute__((no_sanitize("address")))
+#endif
+
/* Clang doesn't have a way to turn it off per-function, yet. */
#ifdef __noretpoline
#undef __noretpoline
--
2.17.0.484.g0c8726318c-goog



2018-04-13 15:33:01

by Andrey Ryabinin

[permalink] [raw]
Subject: Re: [PATCH] kasan: add no_sanitize attribute for clang builds



On 04/12/2018 08:29 PM, Andrey Konovalov wrote:
> KASAN uses the __no_sanitize_address macro to disable instrumentation
> of particular functions. Right now it's defined only for GCC build,
> which causes false positives when clang is used.
>
> This patch adds a definition for clang.
>
> Note, that clang's revision 329612 or higher is required.
>
> Signed-off-by: Andrey Konovalov <[email protected]>
> ---
> include/linux/compiler-clang.h | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
> index ceb96ecab96e..5a1d8580febe 100644
> --- a/include/linux/compiler-clang.h
> +++ b/include/linux/compiler-clang.h
> @@ -25,6 +25,11 @@
> #define __SANITIZE_ADDRESS__
> #endif
>
> +#ifdef CONFIG_KASAN

If, for whatever reason, developer decides to add __no_sanitize_address to some
generic function, guess what will happen next when he/she will try to build CONFIG_KASAN=n kernel?

> +#undef __no_sanitize_address
> +#define __no_sanitize_address __attribute__((no_sanitize("address")))
> +#endif
> +
> /* Clang doesn't have a way to turn it off per-function, yet. */
> #ifdef __noretpoline
> #undef __noretpoline
>

2018-04-13 17:36:30

by Andrey Konovalov

[permalink] [raw]
Subject: Re: [PATCH] kasan: add no_sanitize attribute for clang builds

On Fri, Apr 13, 2018 at 5:31 PM, Andrey Ryabinin
<[email protected]> wrote:
>
>
> On 04/12/2018 08:29 PM, Andrey Konovalov wrote:
>> KASAN uses the __no_sanitize_address macro to disable instrumentation
>> of particular functions. Right now it's defined only for GCC build,
>> which causes false positives when clang is used.
>>
>> This patch adds a definition for clang.
>>
>> Note, that clang's revision 329612 or higher is required.
>>
>> Signed-off-by: Andrey Konovalov <[email protected]>
>> ---
>> include/linux/compiler-clang.h | 5 +++++
>> 1 file changed, 5 insertions(+)
>>
>> diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
>> index ceb96ecab96e..5a1d8580febe 100644
>> --- a/include/linux/compiler-clang.h
>> +++ b/include/linux/compiler-clang.h
>> @@ -25,6 +25,11 @@
>> #define __SANITIZE_ADDRESS__
>> #endif
>>
>> +#ifdef CONFIG_KASAN
>
> If, for whatever reason, developer decides to add __no_sanitize_address to some
> generic function, guess what will happen next when he/she will try to build CONFIG_KASAN=n kernel?

It's defined to nothing in compiler-gcc.h and redefined in
compiler-clang.h only if CONFIG_KASAN is enabled, so everything should
be fine. Am I missing something?

>
>> +#undef __no_sanitize_address
>> +#define __no_sanitize_address __attribute__((no_sanitize("address")))
>> +#endif
>> +
>> /* Clang doesn't have a way to turn it off per-function, yet. */
>> #ifdef __noretpoline
>> #undef __noretpoline
>>

2018-04-13 19:18:55

by Andrey Ryabinin

[permalink] [raw]
Subject: Re: [PATCH] kasan: add no_sanitize attribute for clang builds



On 04/13/2018 08:34 PM, Andrey Konovalov wrote:
> On Fri, Apr 13, 2018 at 5:31 PM, Andrey Ryabinin
> <[email protected]> wrote:
>>
>>
>> On 04/12/2018 08:29 PM, Andrey Konovalov wrote:
>>> KASAN uses the __no_sanitize_address macro to disable instrumentation
>>> of particular functions. Right now it's defined only for GCC build,
>>> which causes false positives when clang is used.
>>>
>>> This patch adds a definition for clang.
>>>
>>> Note, that clang's revision 329612 or higher is required.
>>>
>>> Signed-off-by: Andrey Konovalov <[email protected]>
>>> ---
>>> include/linux/compiler-clang.h | 5 +++++
>>> 1 file changed, 5 insertions(+)
>>>
>>> diff --git a/include/linux/compiler-clang.h b/include/linux/compiler-clang.h
>>> index ceb96ecab96e..5a1d8580febe 100644
>>> --- a/include/linux/compiler-clang.h
>>> +++ b/include/linux/compiler-clang.h
>>> @@ -25,6 +25,11 @@
>>> #define __SANITIZE_ADDRESS__
>>> #endif
>>>
>>> +#ifdef CONFIG_KASAN
>>
>> If, for whatever reason, developer decides to add __no_sanitize_address to some
>> generic function, guess what will happen next when he/she will try to build CONFIG_KASAN=n kernel?
>
> It's defined to nothing in compiler-gcc.h and redefined in
> compiler-clang.h only if CONFIG_KASAN is enabled, so everything should
> be fine. Am I missing something?

No, It's was me missing something ;)
However, "#ifdef CONFIG_KASAN" seems to be redundant, I'd rather remove it.

Anyway:
Acked-by: Andrey Ryabinin <[email protected]>

2018-04-17 12:29:38

by Andrey Konovalov

[permalink] [raw]
Subject: Re: [PATCH] kasan: add no_sanitize attribute for clang builds

On Fri, Apr 13, 2018 at 9:16 PM, Andrey Ryabinin
<[email protected]> wrote:
> However, "#ifdef CONFIG_KASAN" seems to be redundant, I'd rather remove it.

Done, sent v2.

Thanks!