URL: https://github.com/SSSD/sssd/pull/96
Author: lslebodn
 Title: #96: CONFDB: Supress clang false passitive warnings
Action: opened

PR body:
"""
The errno is macro expandee into '(*__errno_location ())'.
The reason is that errno is private in glibc and and the
function __errno_location return address of private errno.

  sh$ objdump -T /lib64/libc.so.6 | grep errno
  00000010 g    D  .tbss  00000004  GLIBC_PRIVATE errno
  000208a0 g    DF .text  00000011  GLIBC_2.2.5 __errno_location
  001366b0 g    DF .text  0000005f  GLIBC_2.2.5 clnt_sperrno
  00136710 g    DF .text  00000074  GLIBC_2.2.5 clnt_perrno
  00000064 g    D  .tbss  00000004  GLIBC_PRIVATE __h_errno
  0011aad0 g    DF .text  00000011  GLIBC_2.2.5 __h_errno_location

It looks like clang static analyzer assume that value can be
changed due to function call.

  errno = 0;
  val = strtol(values[0], NULL, 0);
  // Taking true branch => assuming "errno != 0"
  if (errno) {
      ret = errno;
      // errno was stored to ret but clang later assumes
      // that ret can be 0
      goto failed;
"""

To pull the PR as Git branch:
git remote add ghsssd https://github.com/SSSD/sssd
git fetch ghsssd pull/96/head:pr96
git checkout pr96
From 8a80082e0e8a3c85f6f491ab5eca5a967c4195ae Mon Sep 17 00:00:00 2001
From: Lukas Slebodnik <lsleb...@redhat.com>
Date: Sat, 26 Nov 2016 17:07:07 +0100
Subject: [PATCH] CONFDB: Supress clang false passitive warnings

The errno is macro expandee into '(*__errno_location ())'.
The reason is that errno is private in glibc and and the
function __errno_location return address of private errno.

  sh$ objdump -T /lib64/libc.so.6 | grep errno
  00000010 g    D  .tbss  00000004  GLIBC_PRIVATE errno
  000208a0 g    DF .text  00000011  GLIBC_2.2.5 __errno_location
  001366b0 g    DF .text  0000005f  GLIBC_2.2.5 clnt_sperrno
  00136710 g    DF .text  00000074  GLIBC_2.2.5 clnt_perrno
  00000064 g    D  .tbss  00000004  GLIBC_PRIVATE __h_errno
  0011aad0 g    DF .text  00000011  GLIBC_2.2.5 __h_errno_location

It looks like clang static analyzer assume that value can be
changed due to function call.

  errno = 0;
  val = strtol(values[0], NULL, 0);
  // Taking true branch => assuming "errno != 0"
  if (errno) {
      ret = errno;
      // errno was stored to ret but clang later assumes
      // that ret can be 0
      goto failed;
---
 src/confdb/confdb.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/confdb/confdb.c b/src/confdb/confdb.c
index 512d93f..ac75852 100644
--- a/src/confdb/confdb.c
+++ b/src/confdb/confdb.c
@@ -448,8 +448,8 @@ int confdb_get_int(struct confdb_ctx *cdb,
 
         errno = 0;
         val = strtol(values[0], NULL, 0);
-        if (errno) {
-            ret = errno;
+        ret = errno;
+        if (ret) {
             goto failed;
         }
 
@@ -504,8 +504,8 @@ long confdb_get_long(struct confdb_ctx *cdb,
 
         errno = 0;
         val = strtol(values[0], NULL, 0);
-        if (errno) {
-            ret = errno;
+        ret = errno;
+        if (ret) {
             goto failed;
         }
 
_______________________________________________
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org

Reply via email to