2014-12-17 18:49:39

by Bjorn Helgaas

[permalink] [raw]
Subject: Re: How to fix CHECK warning: testing a 'safe expression' ?

[+cc Christopher, linux-kernel (this doesn't sound like a PCI-specific
question)]

On Wed, Dec 17, 2014 at 9:18 AM, Murali Karicheri <[email protected]> wrote:
> I am trying to address CHECK warnings in my driver and wondering how to
> resolve 'warning: testing a 'safe expression' which appears when using
> IS_ERR_OR_NULL(foo)
>
> where foo is defined as
>
> struct foo_type *foo;
>
> The foo get assigned only NULL or ERR_PTR(error code). So I believe the
> usage is correct. But then how do I make the CHECK happy of its usage?
>
> I have tried a grep to check on the current usage of IS_ERR_OR_NULL() and
> found 276 of them causes this warning in the v3.18 version of the kernel
> that I am using
>
> $ grep -r "warning: testing a 'safe expression" * | wc -l
> 276
>
> Can someone help me undestand what this means and how to fix the same?
>
> I run folling for CHECK
>
> make C=2 CF="-D__CHECK_ENDIAN__" CHECK=sparse

If you can share your actual code or point to it in the tree, you
might get more specific help.

Bjorn


2014-12-17 22:35:26

by Karicheri, Muralidharan

[permalink] [raw]
Subject: Re: How to fix CHECK warning: testing a 'safe expression' ?

On 12/17/2014 01:49 PM, Bjorn Helgaas wrote:
> [+cc Christopher, linux-kernel (this doesn't sound like a PCI-specific
> question)]
>
> On Wed, Dec 17, 2014 at 9:18 AM, Murali Karicheri<[email protected]> wrote:
>> I am trying to address CHECK warnings in my driver and wondering how to
>> resolve 'warning: testing a 'safe expression' which appears when using
>> IS_ERR_OR_NULL(foo)
>>
>> where foo is defined as
>>
>> struct foo_type *foo;
>>
>> The foo get assigned only NULL or ERR_PTR(error code). So I believe the
>> usage is correct. But then how do I make the CHECK happy of its usage?
>>
>> I have tried a grep to check on the current usage of IS_ERR_OR_NULL() and
>> found 276 of them causes this warning in the v3.18 version of the kernel
>> that I am using
>>
>> $ grep -r "warning: testing a 'safe expression" * | wc -l
>> 276
>>
>> Can someone help me undestand what this means and how to fix the same?
>>
>> I run folling for CHECK
>>
>> make C=2 CF="-D__CHECK_ENDIAN__" CHECK=sparse
>
> If you can share your actual code or point to it in the tree, you
> might get more specific help.
>
> Bjorn

For example I get

CHECK drivers/pci/host/pci-keystone.c
include/linux/err.h:40:16: warning: testing a 'safe expression'

Actually it is for IS_ERR_OR_NULL() call in the file which is the only
one call in the file.

--
Murali Karicheri
Linux Kernel, Texas Instruments

2014-12-17 22:37:11

by Karicheri, Muralidharan

[permalink] [raw]
Subject: Re: How to fix CHECK warning: testing a 'safe expression' ?

On 12/17/2014 05:35 PM, Murali Karicheri wrote:
> On 12/17/2014 01:49 PM, Bjorn Helgaas wrote:
>> [+cc Christopher, linux-kernel (this doesn't sound like a PCI-specific
>> question)]
>>
>> On Wed, Dec 17, 2014 at 9:18 AM, Murali Karicheri<[email protected]>
>> wrote:
>>> I am trying to address CHECK warnings in my driver and wondering how to
>>> resolve 'warning: testing a 'safe expression' which appears when using
>>> IS_ERR_OR_NULL(foo)
>>>
>>> where foo is defined as
>>>
>>> struct foo_type *foo;
>>>
>>> The foo get assigned only NULL or ERR_PTR(error code). So I believe the
>>> usage is correct. But then how do I make the CHECK happy of its usage?
>>>
>>> I have tried a grep to check on the current usage of IS_ERR_OR_NULL()
>>> and
>>> found 276 of them causes this warning in the v3.18 version of the kernel
>>> that I am using
>>>
>>> $ grep -r "warning: testing a 'safe expression" * | wc -l
>>> 276
>>>
>>> Can someone help me undestand what this means and how to fix the same?
>>>
>>> I run folling for CHECK
>>>
>>> make C=2 CF="-D__CHECK_ENDIAN__" CHECK=sparse
>>
>> If you can share your actual code or point to it in the tree, you
>> might get more specific help.
>>
>> Bjorn
>
> For example I get
>
> CHECK drivers/pci/host/pci-keystone.c
> include/linux/err.h:40:16: warning: testing a 'safe expression'
>
> Actually it is for IS_ERR_OR_NULL() call in the file which is the only
> one call in the file.
>
Here is the code snippet for your convenience

struct device *dev = &pdev->dev;
struct keystone_pcie *ks_pcie;
struct pcie_port *pp;
struct resource *res;
void __iomem *reg_p;
struct phy *phy;
int ret = 0;

ks_pcie = devm_kzalloc(&pdev->dev, sizeof(*ks_pcie),
GFP_KERNEL);
if (!ks_pcie) {
dev_err(dev, "no memory for keystone pcie\n");
return -ENOMEM;
}
pp = &ks_pcie->pp;

/* initialize SerDes Phy if present */
phy = devm_phy_get(dev, "pcie-phy");
===> if (!IS_ERR_OR_NULL(phy)) {
ret = phy_init(phy);
if (ret < 0)
return ret;
}



--
Murali Karicheri
Linux Kernel, Texas Instruments

2014-12-18 02:39:12

by Christopher Li

[permalink] [raw]
Subject: Re: How to fix CHECK warning: testing a 'safe expression' ?

On Thu, Dec 18, 2014 at 6:37 AM, Murali Karicheri <[email protected]> wrote:
> if (!ks_pcie) {
> dev_err(dev, "no memory for keystone pcie\n");
> return -ENOMEM;
> }
> pp = &ks_pcie->pp;
>
> /* initialize SerDes Phy if present */
> phy = devm_phy_get(dev, "pcie-phy");
> ===> if (!IS_ERR_OR_NULL(phy)) {
> ret = phy_init(phy);
> if (ret < 0)
> return ret;
>

Hi,

Do you have a smaller stand alone test case which I can reproduce with sparse?

Thanks

Chris

2014-12-18 17:45:31

by Karicheri, Muralidharan

[permalink] [raw]
Subject: Re: How to fix CHECK warning: testing a 'safe expression' ?

On 12/17/2014 09:39 PM, Christopher Li wrote:
> On Thu, Dec 18, 2014 at 6:37 AM, Murali Karicheri<[email protected]> wrote:
>> if (!ks_pcie) {
>> dev_err(dev, "no memory for keystone pcie\n");
>> return -ENOMEM;
>> }
>> pp =&ks_pcie->pp;
>>
>> /* initialize SerDes Phy if present */
>> phy = devm_phy_get(dev, "pcie-phy");
>> ===> if (!IS_ERR_OR_NULL(phy)) {
>> ret = phy_init(phy);
>> if (ret< 0)
>> return ret;
>>
>
> Hi,
>
> Do you have a smaller stand alone test case which I can reproduce with sparse?
>
> Thanks
>
> Chris
Thanks Chris for responding.

You could add this piece of code for testing

struct foo {
int x;
int y;
};

static struct foo *func1(struct device *dev)
{
struct foo *fp;

fp = devm_kzalloc(dev, sizeof(*fp), GFP_KERNEL);
if (fp == NULL)
return ERR_PTR(-ENOMEM);
return fp;
}

And in one of your module in kernel add

struct foo *fp;

if (IS_ERR_OR_NULL(fp))
return -ENOMEM;

and do

make C=2 CF="-D__CHECK_ENDIAN__" CHECK=sparse

You will see the CHECK warning against your module as

include/linux/err.h:40:16: warning: testing a 'safe expression'

Hope this helps.

--
Murali Karicheri
Linux Kernel, Texas Instruments