Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么静态分析器找不到潜在的未初始化读取?_C++_Static Analysis - Fatal编程技术网

C++ 为什么静态分析器找不到潜在的未初始化读取?

C++ 为什么静态分析器找不到潜在的未初始化读取?,c++,static-analysis,C++,Static Analysis,我想知道为什么我使用的静态分析器工具无法检测到以下简单错误(可能是单位化变量): 有人能给我推荐一些分析工具,让我知道变量x可能未初始化吗?无法相信人类仍然没有这样的解决方案。因为你实际上是在一个条件下向*pRcvd写入数据,静态分析器可能无法轻松确定这个条件是否会计算为错误。特别是如果条件中的值来自链接库 我可以想象,静态分析器可能会决定根本不发出警告——如果它不确定的话。因为误报警告很烦人,如果警告太多,人们往往会忽略这些警告 虽然理论上可能捕捉到这样的错误,但假设可以在编译时确定,这样做可

我想知道为什么我使用的静态分析器工具无法检测到以下简单错误(可能是单位化变量):


有人能给我推荐一些分析工具,让我知道变量
x
可能未初始化吗?无法相信人类仍然没有这样的解决方案。

因为你实际上是在一个条件下向
*pRcvd
写入数据,静态分析器可能无法轻松确定这个条件是否会计算为错误。特别是如果条件中的值来自链接库

我可以想象,静态分析器可能会决定根本不发出警告——如果它不确定的话。因为误报警告很烦人,如果警告太多,人们往往会忽略这些警告


虽然理论上可能捕捉到这样的错误,但假设可以在编译时确定,这样做可能非常困难,因此可能无法在静态分析器中实现。

因为您实际上是在某个条件下写入
*pRcvd
,静态分析器可能无法轻松确定此条件的计算结果是否为false。特别是如果条件中的值来自链接库

我可以想象,静态分析器可能会决定根本不发出警告——如果它不确定的话。因为误报警告很烦人,如果警告太多,人们往往会忽略这些警告


虽然理论上可能捕捉到这样的错误,但假设可以在编译时确定,这样做可能非常困难,因此可能无法在静态分析器中实现。

是的,目前PVS Studio分析器无法检测到此错误。这个案例看起来很简单,但实际上这种分析相当复杂。我们不断改进过程间分析和数据流分析。我们希望,随着时间的推移,也将有可能发现此类错误

注意:在这种情况下,静态分析仪通常会让步,因为它们不能考虑所有的互连并跟踪变量的变化。动态代码分析器可以很好地执行未初始化变量的搜索。尝试一个动态分析器


但不要试图选择使用什么:静态或动态分析。有些错误可以通过静态分析器发现,有些错误可以通过动态分析器发现。这些方法相辅相成。更多详细信息:。

是的,目前PVS Studio analyzer无法检测到此错误。这个案例看起来很简单,但实际上这种分析相当复杂。我们不断改进过程间分析和数据流分析。我们希望,随着时间的推移,也将有可能发现此类错误

注意:在这种情况下,静态分析仪通常会让步,因为它们不能考虑所有的互连并跟踪变量的变化。动态代码分析器可以很好地执行未初始化变量的搜索。尝试一个动态分析器


但不要试图选择使用什么:静态或动态分析。有些错误可以通过静态分析器发现,有些错误可以通过动态分析器发现。这些方法相辅相成。更多详细信息:。

这不是C代码。我将为您重新标记它。“我使用的静态分析器工具”-这些工具是什么?它们是如何配置的?你能把你的代码减少到一个最小的例子,再现错误,但仍然缺乏警告吗?一个现代的C++编译器应该明确发出警告。所以问题是,在分析这个函数时,它假设gps_parse()写stat_mask,但它没有检查gps_parse()是否在所有情况下都写stat_mask,然后将其反馈给这个函数的分析?这听起来像是您的分析器中缺少的功能。@BartekBanachewicz写入是有条件的,例如,确定,但我所有的其他问题仍然有效。“我未指定的工具在这种情况下无法工作,为什么?”在不知道该工具最初是什么的情况下无法回答。即使这样,我还是希望有类似“不可能”或“只是没有实现”的东西,这不是C代码。我将为您重新标记它。“我使用的静态分析器工具”-这些工具是什么?它们是如何配置的?你能把你的代码减少到一个最小的例子,再现错误,但仍然缺乏警告吗?一个现代的C++编译器应该明确发出警告。所以问题是,在分析这个函数时,它假设gps_parse()写stat_mask,但它没有检查gps_parse()是否在所有情况下都写stat_mask,然后将其反馈给这个函数的分析?这听起来像是您的分析器中缺少的功能。@BartekBanachewicz写入是有条件的,例如,确定,但我所有的其他问题仍然有效。“我未指定的工具在这种情况下无法工作,为什么?”在不知道该工具最初是什么的情况下无法回答。即便如此,我还是希望有类似于“不可能”或“只是没有实现”的事情发生。
    S08 GPS_Nmea::handler(GPS_INF *pGps, U08 *pRcvd) {
      S08 sErr;
      U08 byte;
      U08 mask = 0;
      U08 stat_mask;

      while (Q08_GetLength(&gps_q)) {
        sErr = Q08_Read(&gps_q, &byte, 1);
        if (sErr != Q_OK)
          continue;
        if ((EPBEXSTN.RS_Settings.D == RS485_NMEA_OUT) ||
            (EPBEXSTN.RS_Settings2.D == RS485_NMEA_OUT) ||
            (EPBEXSTN.RS_Settings3.D == RS485_NMEA_OUT)) {
          if (ts.p_dev != 0)
            ts.p_dev->write(&byte, 1);
        }
        sErr = _gps_fsm(byte);
        if (sErr == TRUE) {
          sErr = _gps_parse(gps_buf, pGps, &stat_mask);
          gps_rx_state = GPS_ST_WAIT;

          if (stat_mask == STR_RMC)
            mask |= STR_RMC;
          if (stat_mask == STR_GGA)
            mask |= STR_GGA;
          mask |= STR_ANY;
        }
      }

      if (pRcvd != NULL)
        *pRcvd = mask;

      return RC_ERR_NONE;
    }

S08 GPS_Nmea::_gps_parse (char* pBuf, GPS_INF* pGps, U08* pRcvd)
{
    S08 sErr;

    if ((memcmp(pBuf, "$GPRMC", 6) == 0) ||
        (memcmp(pBuf, "$GLRMC", 6) == 0) ||
        (memcmp(pBuf, "$GNRMC", 6) == 0))
    {
        APP_PRINTF (GPS_TRACE, ("-I- gps: $xxRMC parse\r\n"));
        //APP_PRINTF (GPS_TRACE, ("-I- gps: string - %s\r\n", gps_buf));

        GpsTmp = *pGps;
        sErr = _gprmc_parse (pBuf, &GpsTmp);
        if (sErr == RC_ERR_NONE)
        {
            *pGps = GpsTmp;
            *pRcvd = STR_RMC;

            if (pGps->valid == FALSE)
                APP_PRINTF (GPS_WARNING, ("-W- gps_lib: gps data isn't valid\r\n"));
        }
        else
        {
            APP_PRINTF (GPS_ERROR, ("-E- gps_lib: _gprmc_parse() error\r\n"));
            clr_struct (pGps);
        }

        return sErr;
    }
    else if ((memcmp(pBuf, "$GPGGA", 6) == 0) ||
             (memcmp(pBuf, "$GLGGA", 6) == 0) ||
             (memcmp(pBuf, "$GNGGA", 6) == 0))
    {
        APP_PRINTF (GPS_TRACE, ("-I- gps: $xxGGA parse\r\n"));
        //APP_PRINTF (GPS_TRACE, ("-I- gps: string - %s\r\n", gps_buf));

        GpsTmp = *pGps;
        sErr = _gpgga_parse (pBuf, &GpsTmp);
        if (sErr == RC_ERR_NONE)
        {
            *pGps = GpsTmp;
            *pRcvd = STR_GGA;
        }
        else
        {
            APP_PRINTF (GPS_ERROR, ("-E- gps_lib: _gpgga_parse() error\r\n"));
            clr_struct (pGps);
        }

        return sErr;
    }
    else if ((memcmp(pBuf, "$GPGSV", 6) == 0) ||
             (memcmp(pBuf, "$GLGSV", 6) == 0) ||
             (memcmp(pBuf, "$GNGSV", 6) == 0) )
  {
    APP_PRINTF (GPS_TRACE, ("-I- gps: $xxGSV parse\r\n"));

        sErr = _gpgsv_parse (pBuf);
        if (sErr == RC_ERR_NONE)
        {
        }
        else
        {
            APP_PRINTF (GPS_ERROR, ("-E- gps_lib: _gpgga_parse() error\r\n"));
        }
        return sErr;
  }
    else if ((memcmp(pBuf, "$GPGSA", 6) == 0) ||
             (memcmp(pBuf, "$GLGSA", 6) == 0) ||
             (memcmp(pBuf, "$GNGSA", 6) == 0) )
  {
    APP_PRINTF (GPS_TRACE, ("-I- gps: $xxGSA parse\r\n"));
        GpsTmp = *pGps;
        sErr = _gpgsa_parse (pBuf, &GpsTmp);
        if (sErr == RC_ERR_NONE)
        {
            *pGps = GpsTmp;
            *pRcvd = STR_GSA;
        }
    else
        {
            APP_PRINTF (GPS_ERROR, ("-E- gps_lib: _gpgga_parse() error\r\n"));
        }
        return sErr;
  }
    else if ((memcmp(pBuf, "$GPZDA", 6) == 0) ||
             (memcmp(pBuf, "$GLZDA", 6) == 0) ||
             (memcmp(pBuf, "$GNZDA", 6) == 0) )
  {
    APP_PRINTF (GPS_TRACE, ("-I- gps: $xxZDA parse\r\n"));
        GpsTmp = *pGps;
        sErr = _gpzda_parse (pBuf);
        if (sErr == RC_ERR_NONE)
        {
            *pGps = GpsTmp;
            *pRcvd = STR_ZDA;
        }
    else
        {
            APP_PRINTF (GPS_ERROR, ("-E- gps_lib: _gpzda_parse() error\r\n"));
        }
        return sErr;
  }
    else if (memcmp(pBuf, "$PMTK705", 8) == 0) 
  {
    APP_PRINTF (GPS_TRACE, ("-I- gps: $PMTK705 parse\r\n"));
    int ver_len = strlen(pBuf+9) - 4;
    if (ver_len > sizeof(tsk_gps.gps_version)-1)
      ver_len = sizeof(tsk_gps.gps_version)-1;
    memcpy(tsk_gps.gps_version,pBuf+9,ver_len);
        return RC_ERR_NONE;
  }
    else if (memcmp(pBuf, "$PMTKSPF", 8) == 0) 
  {
    static U08 jamming_active_cnt = 0;
    static U08 jamming_prev_state = FALSE;
    APP_PRINTF (GPS_TRACE, ("-I- gps: $PMTKSPF parse\r\n"));
    tsk_gps.jamming_pmtk_to = 0;
    if (memcmp(pBuf, "$PMTKSPF,3", 10) == 0)
    { if (jamming_active_cnt < 60) jamming_active_cnt ++; }
    else
    { if (jamming_active_cnt != 0) jamming_active_cnt --; }
    if (jamming_active_cnt > 30)
    {
      if (bsp.m_DevInfo.jamming_gps)
      {
        tsk_gps.jamming_data = TRUE;
        if (jamming_prev_state == FALSE)
        {
          ev_bus.add(GLOB_EV_JAMMING_GPS);
        }
      }
      jamming_prev_state = TRUE;
    }
    else
      jamming_prev_state = FALSE;
        return RC_ERR_NONE;
  }
#if defined (MAKE_ERA)
    else if (memcmp(pBuf, "$PSTMGETALGOOK", 14) == 0)
  {
        if (memcmp(pBuf+15, "1,1", 3) == 0)
    {
            pGps->fde_status = 1;
        }
    else
        {
            pGps->fde_status = 0;
        }
        return sErr;
  }
#endif
    else
    {
        gps_buf[6] = 0;
        //APP_PRINTF (GPS_WARNING, ("-W- gps: undef string - %s\r\n", gps_buf));
    }

    return RC_ERR_DATA;
}
include <stdio.h>

void func(int a, int *px) {
    if (a == 1) 
    {
        *px = 1;
    }
}

int main (void)
{    
    int x;
    func(2, &x);
    printf(x);
}