
PVS-Studioã¯ãCãC ++ãããã³CïŒããã°ã©ã ã®ã³ãŒãã®ãšã©ãŒããã³æœåšçãªè匱æ§ãæ€çŽ¢ããããã®éçã³ãŒãã¢ãã©ã€ã¶ãŒã§ãã ãªãŒãã³ãªãããžã§ã¯ãããã§ãã¯ããèŠã€ãã£ããšã©ãŒãåæããããšã§ãé·ãéããã°ã®èªè ãåã°ããŠããŸããã ã¢ãã©ã€ã¶ãŒã¯çµã¿èŸŒã¿ããã€ã¹ã®ã³ãŒãããã§ãã¯ããããšãåŠãã ã®ã§ãç§ãã¡ã®èšäºã¯ããã«èå³æ·±ããã®ã«ãªãå¯èœæ§ããããŸãã ããã€ãã®ARMã³ã³ãã€ã©ãŒããµããŒãããŸãããããã«ã€ããŠã¯ããã®èšäºã§è©³ãã説æããŸãã çµã¿èŸŒã¿ããã€ã¹ããã³ããããã®ãšã©ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ããã°ã©ã ã®ãšã©ãŒãããããã«å€§ãããªãå¯èœæ§ããããŸãã å èµããã€ã¹ã®ãšã©ãŒã¯ãåã«ããã°ã©ã ã®ã¯ã©ãã·ã¥/ããªãŒãºãŸãã¯äžé©åãªç»åã§ã¯ãããŸããã ããã¯ã¯ã¬ã€ãžãŒãªWi-Fiã±ãã«ã§ã沞隰ããŠæž©åºŠãã¥ãŒãºãäœåãããŸã§æ°Žã沞隰ãããŸãã äžè¬çã«ãçµã¿èŸŒã¿ã·ã¹ãã ã®äžçã§ã¯ãšã©ãŒãçºçããããããã¹ãŠãããé¢çœããæªåããŠããŸãã
ç§ã®æã壮倧ãªãã°
ããã°ã©ããŒãšããŠã®ãã£ãªã¢ã®äžã§ãã³ãŒãã«å€ãã®ééããç¯ããŸããã ããããééãã¯ããæå³éå±ã§ããã äœãããã®ããã«æ©èœããªãã£ããã©ããã§NULLãã€ã³ã¿ãŒãéåç §ãããããªã©ã ã¯ãããããã¯ä¿®æ£ãå¿ èŠãªæ¬åœã®ééãã§ããã ãããããã®å Žãã®ãã®ããããã楜ããã§ããéãç§ã¯èªåã®ééãã«ã€ããŠæãé®®æãªå°è±¡ãåããŸããã
ããããå·¥åŠã§ã¯ãç§ã¯ã¢ããã¥ã¢ã§ãããç§ã®äœåã¯ãã¹ãŠå®éšçã§é¢çœãæ§è³ªã®ãã®ã§ãã å·¥èžåã®1ã€ã¯ããªã¢ãŒãã³ã³ãããŒã«ããå¶åŸ¡ããããããããããŒã«ãšãããºããæãŸãããããšãã§ãã4ã€ã®å°ããªããããã®äœæã§ããã 詳现ã«ã¯è§ŠããŸããããä¹ããããŒã«ãæã€ãçªãã€ãããé³ãåºããLEDãç¹æ» ãããæ¹æ³ãç¥ã£ãŠããããšã ãã«æ³šæããŸãã å®éãæ ¹æ ããªãããã«ãããã«ããããã®1ã€ããããŸãã

ãããã¯ãATmega8Aãã€ã¯ãã³ã³ãããŒã©ãŒïŒ8 Kãã€ããã©ãã·ã¥ã512ãã€ãEEPROMã1 Kãã€ãRAMïŒã«åºã¥ããŠå®è£ ãããŠããŸãã ããã°ã©ã ã®æåã®ããŒãžã§ã³ã§ã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã®ã¿ã€ããŒã®1ã€ãå²ã蟌ã¿ãçæãããã®ããã»ããµãŒã§ãªã¢ãŒãã³ã³ãããŒã«ããã®ã³ãã³ããèªã¿åãããŸããã ã³ãã³ããããå Žåããããã¯FIFOãããã¡ã«æžã蟌ãŸããããããã¡ã€ã³ããã°ã©ã ãµã€ã¯ã«ã§æœåºããã³å®è¡ãããŸãã ããŒã ã¯æ¬¡ã®ãããªãã®ã§ããã å·Š/å³ã«æ²ãã£ãŠãã ããã å°ãå·Šã«æ²ãã£ãŠé²ã¿ãŸãã ããŠã¹ãã€ãã¿ãŸãã ããŒã«ã蹎ããªã©ã
å®éããã¹ãŠãåè€éåããŸããã ãã®åŸãFIFOãããã¡ãŒãåãé€ããäžè¬çã«ãŸããŸãã·ã³ãã«ãã€çŸããæžã蟌ã¿ãŸããã
æ³åããŠã¿ãŠãã ããããã€ã¯ãã³ã³ãããŒã©ãŒã«æ°ããããã°ã©ã ãã¢ããããŒãããããããã®é»æºãå ¥ãããš...çªç¶ãããããã¯èªåã®ç掻ãå§ããŸãïŒ

ãããã¯äžèŠåã«åºãèµ°ããçªãã¯ãªãã¯ããååšããªãããŒã«ãæŒããç¹æ» ããŸãã ããã«ãè¡åã¯ç§ã«ã¯å®å šã«ç解äžèœã§ãã ç§ã®æèŠã§ã¯ãããããã«ã¯ãã®ãããªã¢ã¯ã·ã§ã³ãåŒãèµ·ããå¯èœæ§ã®ããã³ãŒãã¯ãããŸããã
ããã¯ãããã°ã©ãã³ã°ã®ãã¹ãŠã®å¹Žã«åãåã£ãããã°ã©ã ãšã©ãŒã®æ倧ã®å°è±¡ã§ããã ã¹ã¿ãã¯ãªãŒããŒãããŒãåå ã§ããã°ã©ã ãã¯ã©ãã·ã¥ããå Žåãšãçæ°ã®ãããããç®ã®åã«è£ çãããŠããå Žåã®1ã€ã§ãã ãã®ã¢ã¯ã·ã§ã³ãšç§ã®ææ ãããã¯ã°ã©ãŠã³ãã§æ®åœ±ããããšãæšæž¬ããªãã£ãã®ã¯æ®å¿µã§ã:)ã
çãè©Šè¡ã®åŸãæãå€å žçãªããã°ã©ãã³ã°ãšã©ãŒã®1ã€ãè¡ã£ãããšãããããŸãããFIFOãããã¡ãŒã«æªåŠçã®ã³ãã³ãã®æ°ãæ ŒçŽããå€æ°ãåæåãããŠããªãããšãå€æããŸããã ããããã¯ã³ãã³ãã®ã©ã³ãã ã·ãŒã±ã³ã¹ã®å®è¡ãéå§ãããããã¡ããããŒã¿ãèªã¿åãããã§ã«ãããã¡ã®åŸã«ããããŒã¿ãèªã¿åããŸããã
ãªããã®è©±ãããã®ã§ããïŒ ãã€ã¯ãã³ã³ãããŒã©ããã°ã©ã ã®ãšã©ãŒããã£ãšå£®èŠ³ã«ãªãå¯èœæ§ãããããšã瀺ãããã ãã«ãå°æ¥ãèå³æ·±ãåºçç©ã§èªè ãåã°ããããšæããŸãã ããã§ã¯ãPVS-Studioã¢ãã©ã€ã¶ãŒã®æ°ããããŒãžã§ã³ã®ãªãªãŒã¹ã«é¢ããèšäºã®ã¡ã€ã³ãããã¯ã«æ»ããŸãããã
PVS-Studio 6.22
PVS-Studio 6.22ã¢ãã©ã€ã¶ãŒã®æ°ããããŒãžã§ã³ã§ã¯ã次ã®ã¿ã€ãã®ãããžã§ã¯ãããã§ãã¯ããããã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãããŒã ãå®æãããŸããã
- Keil uVision 5ã®äžéšãšããŠARMã³ã³ãã€ã©5ããã³ARMã³ã³ãã€ã©6ã®ãµããŒããè¿œå ãããŸããã
- Keil DS-MDKç°å¢ã®äžéšãšããŠã®ã³ã³ãã€ã©ARMã³ã³ãã€ã©5ããã³ARMã³ã³ãã€ã©6ã
- IAR Embedded Workbenchã®äžéšãšããŠãARMåãIAR C / C ++ã³ã³ãã€ã©ããµããŒãããŠããŸãã
RTã¹ã¬ãããããžã§ã¯ã
PVS-Studioã®æ°æ©èœãå®èšŒããã«ã¯ããªãŒãã³ãããžã§ã¯ããå¿ èŠã§ããããRT-ThreadãéžæããŸããã ãã®ãããžã§ã¯ãã¯ãgcc / keil / iarã¢ãŒãã§çµã¿ç«ãŠãããšãã§ããŸãã ã¢ãã©ã€ã¶ãŒã®è¿œå ãã¹ãã®ããã«ãKeilã¢ãŒããšIARã¢ãŒãã®äž¡æ¹ã§ãã¹ãããŸããã ã¬ããŒãã¯ã»ãšãã©åãã ã£ãã®ã§ãåŸã§ã©ã¡ãã䜿çšãããèŠããŠããŸããã
RT-Threadãããžã§ã¯ãèªäœã«ã€ããŠå°ã話ããŸãããã

RT-Threadã¯äžåœã®ãªãŒãã³ãœãŒã¹IoTãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ããã匷åãªã¹ã±ãŒã©ããªãã£ãåããŠããŸããããšãã°ãARM Cortex-M0ãCortex-M3 / 4/7ãªã©ã®å°ããªã³ã¢ã§å®è¡ãããå°ããªã«ãŒãã«ãããå®è¡ãããè±å¯ãªæ©èœã·ã¹ãã ãŸã§ã MIPS32ãARM Cortex-A8ãARM Cortex-A9 DualCoreãªã©
å ¬åŒãŠã§ããµã€ãïŒ rt-thread.org
ãœãŒã¹ã³ãŒãïŒ rt-thread
RT-Threadãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ãPVS-Studioã䜿çšããŠãã¹ããããæåã®çµã¿èŸŒã¿ãããžã§ã¯ãã«ãªãéåžžã«è¯ãåè£ã ãšæããŸãã
RT-Threadãããžã§ã¯ãã§æ°ã¥ãããšã©ãŒ
ç§ã¯PVS-Studioã¢ãã©ã€ã¶ãŒã®ã¬ããŒãããã£ãšèŠãŠã95ã®èŠåãéžæããŸãããããã¯ãç§ã®æèŠã§ã¯ãæãèå³æ·±ããã®ã§ããã å®å šãªHTMLã¬ããŒããå«ãrt-thread-html-log.zipã¢ãŒã«ã€ããããŠã³ããŒãããããšã§ããããã«æ £ããããšãã§ããŸãã æè¿ãã®åœ¢åŒãå®è£ ããŸãããããã¹ãŠã®ãŠãŒã¶ãŒããã®åœ¢åŒãç¥ã£ãŠããããã§ã¯ãããŸããã ããã§ãç§ã¯æ©äŒã«ã€ããŠããã«ã€ããŠåã³æžãããšã«ããŸããã Firefoxã§ã¯ããã®ã¬ããŒãã¯æ¬¡ã®ããã«ãªããŸãã

ãã®ã¬ããŒãã¯ãClangã¢ãã©ã€ã¶ãŒã«ãã£ãŠçæãããHTMLã¬ããŒããšã®é¡æšã«ãã£ãŠäœæãããŸãã ã¬ããŒãã«ã¯ãœãŒã¹ã³ãŒãã®äžéšãä¿åãããããã°ã©ã ã®èŠåã®ã©ã®éšåã«å±ããŠããããããã«ç¢ºèªã§ããŸãã èŠåã®1ã€ã衚瀺ããã®ã¯æ¬¡ã®ãšããã§ãã

ãããã®å€ãã¯é¡äŒŒããŠãããããèšäºå ã®95åã®èŠåãã¹ãŠãèæ ®ããããšã¯æå³ããããŸããã ãã®èšäºã§ã¯ãäœããã®çç±ã§èª¬æã«å€ãããšæããã14åã®ã³ãŒãã¹ããããã®ã¿ãæäŸããŸãã
ã泚æ é倧ãªãšã©ãŒã瀺ãéèŠãªèŠåãèŠéããŠããå¯èœæ§ããããŸãã ãããã£ãŠãRT-Threadéçºè ã«ã¯ã95åã®èŠåãå«ãã¬ããŒãã ãã«é Œãã®ã§ã¯ãªãããããžã§ã¯ããèªåã§åæããããã«é Œã¿ãŸãã ããã«ãRT-Threadãããžã§ã¯ããé©åã«ç解ããããã®äžéšã®ã¿ã確èªããããã§ãã
ãã©ã°ã¡ã³ãN1ã CWE-562ïŒã¹ã¿ãã¯å€æ°ã¢ãã¬ã¹ã®æ»ã
void SEMC_GetDefaultConfig(semc_config_t *config) { assert(config); semc_axi_queueweight_t queueWeight; /*!< AXI queue weight. */ semc_queuea_weight_t queueaWeight; semc_queueb_weight_t queuebWeight; .... config->queueWeight.queueaWeight = &queueaWeight; config->queueWeight.queuebWeight = &queuebWeight; }
PVS-StudioèŠåïŒ V506 CWE-562ããŒã«ã«å€æ°ãqueuebWeightããžã®ãã€ã³ã¿ãŒã¯ããã®å€æ°ã®ã¹ã³ãŒãå€ã«ä¿åãããŸãã ãã®ãããªãã€ã³ã¿ãŒã¯ç¡å¹ã«ãªããŸãã fsl_semc.c 257
ãã®é¢æ°ã¯ã2ã€ã®ããŒã«ã«å€æ°ïŒ queueaWeightããã³queuebWeight ïŒã®ã¢ãã¬ã¹ãå€éšæ§é ã«æžã蟌ã¿ãŸãã é¢æ°ãçµäºãããšãå€æ°ã¯ååšããªããªããŸãããæ§é äœã¯ãããã®æ¢ã«ååšããªããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãä¿åããŠäœ¿çšããŸãã å®éããã€ã³ã¿ãŒã¯ã¹ã¿ãã¯äžã®äœã§ãã§ããå ŽæãæããŸãã ããã¯éåžžã«åä»ãªã»ãã¥ãªãã£ãã°ã§ãã
PVS-Studioã¢ãã©ã€ã¶ãŒã¯ãæåŸã®äžå¯©ãªå²ãåœãŠã®ã¿ãå ±åããŸããããã¯ããã®æäœã®å éšæ©èœã«é¢é£ä»ããããŠããŸãã ãã ããæåŸã®å²ãåœãŠãåé€ãŸãã¯ä¿®æ£ããããšãã¢ãã©ã€ã¶ãŒã¯æåã®å²ãåœãŠã«ã€ããŠèŠåãéå§ããŸãã
ãã©ã°ã¡ã³ãN2ã CWE-570ïŒåŒã¯åžžã«åœã§ã
#define CAN_FIFO0 ((uint8_t)0x00U) /*!< receive FIFO0 */ #define CAN_FIFO1 ((uint8_t)0x01U) /*!< receive FIFO1 */ uint8_t can_receive_message_length(uint32_t can_periph, uint8_t fifo_number) { uint8_t val = 0U; if(CAN_FIFO0 == fifo_number){ val = (uint8_t)(CAN_RFIFO0(can_periph) & CAN_RFIFO_RFL0_MASK); }else if(CAN_FIFO0 == fifo_number){ val = (uint8_t)(CAN_RFIFO1(can_periph) & CAN_RFIFO_RFL0_MASK); }else{ /* illegal parameter */ } return val; }
PVS-Studio èŠå ïŒ V517 CWE-570ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ525ã527ãgd32f4xx_can.c 525
fifo_numberåŒæ°ãCAN_FIFO0ãšçãããªãå Žåãé¢æ°ã¯åžžã«0ãè¿ããŸããã³ãŒãã¯ã»ãšãã©ã®å ŽåãCopy-Pasteã䜿çšããŠèšè¿°ãããŠãããã³ããŒããããã©ã°ã¡ã³ãã§ã CAN_FIFO0å®æ°ãCAN_FIFO1ã§çœ®ãæããã®ãå¿ããŠããŸããŸãã ã
ãã©ã°ã¡ã³ãN3ã CWE-571ïŒåŒã¯åžžã«çã§ã
#define PECI_M0D0C_HITHR_M 0xFFFF0000 // High Threshold #define PECI_M0D0C_LOTHR_M 0x0000FFFF // Low Threshold #define PECI_M0D0C_HITHR_S 16 #define PECI_M0D0C_LOTHR_S 0 void PECIDomainConfigGet(....) { unsigned long ulTemp; .... ulTemp = HWREG(ulBase + PECI_O_M0D0C + (ulDomain * 4)); *pulHigh = ((ulTemp && PECI_M0D0C_HITHR_M) >> PECI_M0D0C_HITHR_S); *pulLow = ((ulTemp && PECI_M0D0C_LOTHR_M) >> PECI_M0D0C_LOTHR_S); }
PVS-Studioã®èŠåïŒ
- V560 CWE-571æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0xFFFF0000ã peci.c 372
- V560 CWE-571æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0x0000FFFFã peci.c 373
2ã€ã®åä»ãªã¿ã€ããã¹ïŒ2ã€ã®æŒç®åã®ä»£ããã«ã&&æŒç®åã2å䜿çšãããŸããã
ãã®ããã pulHighå€æ°ã¯åžžã«0ã«èšå®ããã pulLowå€æ°ã¯0ãŸãã¯1ã«èšå®ãããŸããããã¯æããã«ããã°ã©ããŒãæå³ãããã®ã§ã¯ãããŸããã
Cã«æ £ããŠããªã人ãžã®èª¬æãåŒã®çµæïŒulTemp && PECI_M0D0C_xxxxx_MïŒã¯åžžã«0ãŸãã¯1ã§ãããã®åŸã0ãŸãã¯1ãå³ã«ã·ãããããŸãã 0/1ãã16ããããå³ã«ã·ãããããšãåžžã«0ã«ãªããŸãã0/ 1ã§0/1ã«ã·ããããŠãã0ãŸãã¯1ã«ãªããŸãã
ãã©ã°ã¡ã³ãN4ã CWE-480ïŒäžé©åãªæŒç®åã®äœ¿çš
typedef enum _aipstz_peripheral_access_control { kAIPSTZ_PeripheralAllowUntrustedMaster = 1U, kAIPSTZ_PeripheralWriteProtected = (1U < 1), kAIPSTZ_PeripheralRequireSupervisor = (1U < 2), kAIPSTZ_PeripheralAllowBufferedWrite = (1U < 2) } aipstz_peripheral_access_control_t;

PVS-Studioã®èŠåïŒ
- V602 CWE-480ãïŒ1U <1ïŒãåŒã®æ€æ»ãæ€èšããŠãã ããã ã<ãã¯ãããããã<<ãã«çœ®ãæããå¿ èŠããããŸãã fsl_aipstz.h 69
- V602 CWE-480ãïŒ1U <2ïŒãåŒã®æ€æ»ãæ€èšããŠãã ããã ã<ãã¯ãããããã<<ãã«çœ®ãæããå¿ èŠããããŸãã fsl_aipstz.h 70
- V602 CWE-480ãïŒ1U <2ïŒãåŒã®æ€æ»ãæ€èšããŠãã ããã ã<ãã¯ãããããã<<ãã«çœ®ãæããå¿ èŠããããŸãã fsl_aipstz.h 71
ååä»ãå®æ°ã¯2ã®ã¹ãä¹ã§ã次ã®å€ã«çããå¿ èŠããããŸãã1ã2ã4ã4ã ãã®çµæã次ã®å€ãååŸãããŸãã
- kAIPSTZ_PeripheralAllowUntrustedMaster = 1
- kAIPSTZ_PeripheralWriteProtected = 0
- kAIPSTZ_PeripheralRequireSupervisor = 1
- kAIPSTZ_PeripheralAllowBufferedWrite = 1
ãã©ã°ã¡ã³ãN5ã CWE-834ïŒéå°ãªå埩
static int ft5x06_dump(void) { uint8_t i; uint8_t reg_value; DEBUG_PRINTF("[FTS] Touch Chip\r\n"); for (i = 0; i <= 255; i++) { _ft5x06_read(i, ®_value, 1); if (i % 8 == 7) DEBUG_PRINTF("0x%02X = 0x%02X\r\n", i, reg_value); else DEBUG_PRINTF("0x%02X = 0x%02X ", i, reg_value); } DEBUG_PRINTF("\n"); return 0; }
PVS-Studio èŠå ïŒ V654 CWE-834ã«ãŒãã®æ¡ä»¶ 'i <= 255'ã¯åžžã«çã§ãã drv_ft5x06.c 160
ã¿ã€ãuint8_tã®å€æ°ã¯[0..255]ã®ç¯å²ã®å€ãæ ŒçŽã§ãããããæ¡ä»¶i <= 255ã¯åžžã«çã§ãã ãã®ãããã«ãŒãã¯ãããã°ããŒã¿ãééãªãåºåããŸãã
ãã©ã°ã¡ã³ãN6ã CWE-571ïŒåŒã¯åžžã«çã§ã
#define RT_CAN_MODE_NORMAL 0 #define RT_CAN_MODE_LISEN 1 #define RT_CAN_MODE_LOOPBACK 2 #define RT_CAN_MODE_LOOPBACKANLISEN 3 static rt_err_t control(struct rt_can_device *can, int cmd, void *arg) { .... case RT_CAN_CMD_SET_MODE: argval = (rt_uint32_t) arg; if (argval != RT_CAN_MODE_NORMAL || argval != RT_CAN_MODE_LISEN || argval != RT_CAN_MODE_LOOPBACK || argval != RT_CAN_MODE_LOOPBACKANLISEN) { return RT_ERROR; } if (argval != can->config.mode) { can->config.mode = argval; return bxcan_set_mode(pbxcan->reg, argval); } break; .... }
PVS-StudioèŠåïŒ V547 CWE-571åŒã¯åžžã«çã§ãã ããã§ã¯ãããããã&&ãæŒç®åã䜿çšããå¿ èŠããããŸãã bxcan.c 1171
ã±ãŒã¹RT_CAN_CMD_SET_MODEã¯åžžã«æ£ããåŠçãããŸããã å®éã«ã¯ã ïŒxïŒ= 0 || xïŒ= 1 || xïŒ= 2 || xïŒ= 3ïŒãšãã圢åŒã®æ¡ä»¶ã¯åžžã«çã§ãã ã»ãšãã©ã®å Žåãå¥ã®ã¿ã€ããã¹ãæ±ã£ãŠãããããå®éã«ã¯æ¬¡ã®ããã«èšè¿°ããå¿ èŠããããŸãã
if (argval != RT_CAN_MODE_NORMAL && argval != RT_CAN_MODE_LISEN && argval != RT_CAN_MODE_LOOPBACK && argval != RT_CAN_MODE_LOOPBACKANLISEN)
ãã©ã°ã¡ã³ãN7ã CWE-687ïŒåŒæ°å€ãæ£ããæå®ãããŠããªãé¢æ°åŒã³åºã
void MCAN_SetSTDFilterElement(CAN_Type *base, const mcan_frame_filter_config_t *config, const mcan_std_filter_element_config_t *filter, uint8_t idx) { uint8_t *elementAddress = 0; elementAddress = (uint8_t *)(MCAN_GetMsgRAMBase(base) + config->address + idx * 4U); memcpy(elementAddress, filter, sizeof(filter)); }
ã¢ãã©ã€ã¶ãŒã¯ã2ã€ã®ç°ãªãèŠåã§ãšã©ãŒãããã«ç€ºããŸãã
- V579 CWE-687 memcpyé¢æ°ã¯ããã€ã³ã¿ãŒãšãã®ãµã€ãºãåŒæ°ãšããŠåãåããŸãã ééããããããŸããã 3çªç®ã®åŒæ°ã調ã¹ãŸãã fsl_mcan.c 418
- V568 ãsizeofïŒïŒãæŒç®åãã¯ã©ã¹ãžã®ãã€ã³ã¿ã®ãµã€ãºãè©äŸ¡ããã®ã¯å¥åŠã§ããããfilterãã¯ã©ã¹ãªããžã§ã¯ãã®ãµã€ãºã¯è©äŸ¡ããŸããã fsl_mcan.c 418
memcpyé¢æ°ã¯ã mcan_std_filter_element_config_tåã®æ§é å šäœãã³ããŒããã®ã§ã¯ãªãã1ã€ã®ãã€ã³ã¿ãŒã®ãµã€ãºã«çããéšåã®ã¿ãã³ããŒããŸãã
ãã©ã°ã¡ã³ãN8ã CWE-476ïŒNULLãã€ã³ã¿ãŒéåç §
ãã€ã³ã¿ããã§ãã¯ãããåã«éæ¥åç §ãããå ŽåãRT-Threadã³ãŒãã«ãšã©ãŒã¯ãããŸããã§ããã ããã¯éåžžã«äžè¬çãªã¿ã€ãã®ãšã©ãŒã§ãã
static rt_size_t rt_sdcard_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) { int i, addr; struct dfs_partition *part = (struct dfs_partition *)dev->user_data; if (dev == RT_NULL) { rt_set_errno(-EINVAL); return 0; } .... }
PVS-StudioèŠåïŒ V595 CWE-476 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããdevããã€ã³ã¿ãŒã䜿çšãããŸããã ãã§ãã¯è¡ïŒ497ã499ãsdcard.c 497
ãã©ã°ã¡ã³ãN9ã CWE-563ïŒäœ¿çšããªãå€æ°ãžã®å²ãåœãŠ
static void enet_default_init(void) { .... reg_value = ENET_DMA_BCTL; reg_value &= DMA_BCTL_MASK; reg_value = ENET_ADDRESS_ALIGN_ENABLE |ENET_ARBITRATION_RXTX_2_1 |ENET_RXDP_32BEAT |ENET_PGBL_32BEAT |ENET_RXTX_DIFFERENT_PGBL |ENET_FIXED_BURST_ENABLE |ENET_MIXED_BURST_DISABLE |ENET_NORMAL_DESCRIPTOR; ENET_DMA_BCTL = reg_value; .... }
PVS-StudioèŠåïŒ V519 CWE-563 'reg_value'å€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ3427ã3428ãgd32f4xx_enet.c 3428
å²ãåœãŠreg_value = ENET_ADDRESS_ALIGN_ENABLE | ....ã¯ãå€æ°reg_valueã®ä»¥åã®å€ãç²ç ããŸãã æå³ã®ããèšç®ã®çµæã¯å€æ°ã«æ ŒçŽããããããããã¯å¥åŠã§ãã ã»ãšãã©ã®å Žåãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
reg_value = ENET_DMA_BCTL; reg_value &= DMA_BCTL_MASK; reg_value |= ENET_ADDRESS_ALIGN_ENABLE |ENET_ARBITRATION_RXTX_2_1 |ENET_RXDP_32BEAT |ENET_PGBL_32BEAT |ENET_RXTX_DIFFERENT_PGBL |ENET_FIXED_BURST_ENABLE |ENET_MIXED_BURST_DISABLE |ENET_NORMAL_DESCRIPTOR;
ãã©ã°ã¡ã³ãN10ã CWE-665ïŒäžé©åãªåæå
typedef union _dcp_hash_block { uint32_t w[DCP_HASH_BLOCK_SIZE / 4]; uint8_t b[DCP_HASH_BLOCK_SIZE]; } dcp_hash_block_t; typedef struct _dcp_hash_ctx_internal { dcp_hash_block_t blk; .... } dcp_hash_ctx_internal_t; status_t DCP_HASH_Init(DCP_Type *base, dcp_handle_t *handle, dcp_hash_ctx_t *ctx, dcp_hash_algo_t algo) { .... dcp_hash_ctx_internal_t *ctxInternal; .... for (i = 0; i < sizeof(ctxInternal->blk.w) / sizeof(ctxInternal->blk.w[0]); i++) { ctxInternal->blk.w[0] = 0u; } .... }
PVS-StudioèŠåïŒ V767ã«ãŒãå ã®å®æ°ã€ã³ããã¯ã¹ã«ãããwãé åã®èŠçŽ ãžã®çãããã¢ã¯ã»ã¹ã fsl_dcp.c 946
ã¢ãã©ã€ã¶ãŒã¯ãã®èŠåã§CWE IDãšäžèŽããŸããã§ããããæå³çã«ã¯CWE-665ïŒäžé©åãªåæåã§ããã¹ãã§ãã
ã«ãŒãã§ã¯ãå€0ãåžžã«é åã®ãŒãèŠçŽ ã«æžã蟌ãŸããæ®ãã®èŠçŽ ã¯åæåãããŸããã
ãã©ã°ã¡ã³ãN11ã CWE-571ïŒåŒã¯åžžã«çã§ã
static void at91_mci_init_dma_read(struct at91_mci *mci) { rt_uint8_t i; .... for (i = 0; i < 1; i++) { /* Check to see if this needs filling */ if (i == 0) { if (at91_mci_read(AT91_PDC_RCR) != 0) { mci_dbg("Transfer active in current\n"); continue; } } else { if (at91_mci_read(AT91_PDC_RNCR) != 0) { mci_dbg("Transfer active in next\n"); continue; } } length = data->blksize * data->blks; mci_dbg("dma address = %08X, length = %d\n", data->buf, length); if (i == 0) { at91_mci_write(AT91_PDC_RPR, (rt_uint32_t)(data->buf)); at91_mci_write(AT91_PDC_RCR, .....); } else { at91_mci_write(AT91_PDC_RNPR, (rt_uint32_t)(data->buf)); at91_mci_write(AT91_PDC_RNCR, .....); } } .... }
PVS-Studioã®èŠåïŒ
- V547 CWE-571åŒãi == 0ãã¯åžžã«çã§ãã at91_mci.c 196
- V547 CWE-571åŒãi == 0ãã¯åžžã«çã§ãã at91_mci.c 215
ã«ãŒãã®æ¬äœã¯1åã ãå®è¡ãããŸãã æå³ããããŸãã ãªããµã€ã¯ã«ãæžãã®ã§ããïŒ
ããã«ãã«ãŒãæ¬äœã§ã¯å€æ°iãåžžã«0ã§ãããããäžéšã®æ¡ä»¶ã¯åžžã«çã§ãããã³ãŒãã®äžéšãæºããããããšã¯ãããŸããã
å®éãéçºè ã¯ãµã€ã¯ã«ã®æ¬äœã2åå®è¡ããããšãèšç»ããŠããããã§ãããã¿ã€ããã¹ãããŸããã ããããã次ã®ãããªã«ãŒãæ¡ä»¶ãäœæããå¿ èŠããããŸãã
for (i = 0; i <= 1; i++)
ãã®å Žåãæ©èœã³ãŒããæå³ããªããŸãã
ãã©ã°ã¡ã³ãN12ã CWE-457ïŒåæåãããŠããªãå€æ°ã®äœ¿çš
é¢æ°æ¬äœã®å€§ããªæçãæã£ãŠããããšããpoã³ããŸãã ããã¯ãå€æ°kãå€ãèªã¿åãåã«å®éã«ã¯ã©ãã§ãåæåãããŠããªãããšã瀺ãããã«å¿ èŠã§ãã
void LCD_PutPixel (LCD_PANEL panel, uint32_t X_Left, uint32_t Y_Up, LcdPixel_t color) { uint32_t k; uint32_t * pWordData = NULL; uint8_t* pByteData = NULL; uint32_t bitOffset; uint8_t* pByteSrc = (uint8_t*)&color; uint8_t bpp = bits_per_pixel[lcd_config.lcd_bpp]; uint8_t bytes_per_pixel = bpp/8; uint32_t start_bit; if((X_Left >= lcd_hsize)||(Y_Up >= lcd_vsize)) return; if(panel == LCD_PANEL_UPPER) pWordData = (uint32_t*) LPC_LCD->UPBASE + LCD_GetWordOffset(X_Left,Y_Up); else pWordData = (uint32_t*) LPC_LCD->LPBASE + LCD_GetWordOffset(X_Left,Y_Up); bitOffset = LCD_GetBitOffset(X_Left,Y_Up); pByteData = (uint8_t*) pWordData; pByteData += bitOffset/8; start_bit = bitOffset%8; if(bpp < 8) { uint8_t bit_pos = start_bit; uint8_t bit_ofs = 0; for(bit_ofs = 0;bit_ofs <bpp; bit_ofs++,bit_pos++) { *pByteData &= ~ (0x01 << bit_pos); *pByteData |= ((*pByteSrc >> (k+bit_ofs)) & 0x01) << bit_pos; // <= } } .... }
PVS-StudioèŠåïŒ V614 CWE-457åæåãããŠããªãå€æ° 'k'ã䜿çšãããŸããã lpc_lcd.c 510
å€æ°k㯠ãåŒã§äœ¿çšããããŸã§ã©ãã§ãåæåãããŸããã
*pByteData |= ((*pByteSrc >> (k+bit_ofs)) & 0x01) << bit_pos;
ãã©ã°ã¡ã³ãN13ã CWE-670ïŒåžžã«æ£ãããªãå¶åŸ¡ãããŒã®å®è£
HAL_StatusTypeDef FMC_SDRAM_SendCommand(....) { .... /* wait until command is send */ while(HAL_IS_BIT_SET(Device->SDSR, FMC_SDSR_BUSY)) { /* Check for the Timeout */ if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0)||((HAL_GetTick() - tickstart) > Timeout)) { return HAL_TIMEOUT; } } return HAL_ERROR; } return HAL_OK; }
PVS-StudioèŠåïŒ V612 CWE-670ã«ãŒãå ã®ç¡æ¡ä»¶ã®ãæ»ããã stm32f7xx_ll_fmc.c 1029
ã«ãŒãã®æ¬äœã¯1åããå®è¡ãããŸããã ifã¹ããŒãã¡ã³ãã䜿çšããŠåãåäœãååŸããæ¹ãè«ççã§ãããããããã¯éåžžã«çãããã§ãã ãããããäœããã®è«çãšã©ãŒããããŸãã
ãã©ã°ã¡ã³ãN14ã ãã®ä»
å ã»ã©èšã£ãããã«ãç§ã¯ãã®èšäºã§ããã€ãã®ãšã©ãŒã®ã¿ãåŒçšããŸããã éžæããèŠåã®å®å šãªãªã¹ãã¯ãHTMLã¬ããŒãïŒã¬ããŒããšãšãã«ã¢ãŒã«ã€ãïŒ rt-thread-html-log.zip ïŒã«ãããŸãã
æãããªãšã©ãŒã«å ããŠãäžå¯©ãªã³ãŒãã瀺ãèŠåãã¬ããŒãã«æ®ããŸããã ã³ãŒãã«ãšã©ãŒããããã©ããã¯ããããŸãããããã®ã³ãŒãã¯RT-Threadéçºè ãå¿ ã確èªããå¿ èŠããããŸãã ãã®ãããªèŠåã®äŸã瀺ããŸãã
typedef unsigned long rt_uint32_t; static rt_err_t lpc17xx_emac_init(rt_device_t dev) { .... rt_uint32_t regv, tout, id1, id2; .... LPC_EMAC->MCFG = MCFG_CLK_DIV20 | MCFG_RES_MII; for (tout = 100; tout; tout--); LPC_EMAC->MCFG = MCFG_CLK_DIV20; .... }
PVS-StudioèŠåïŒ V529 CWE-670å¥æ°ã»ãã³ãã³ ';' ãforãæŒç®åã®åŸã emac.c 182
ããã°ã©ããŒã¯ã«ãŒãã䜿çšããŠãããããªé 延ãäœæããŸããã éæ¥çã§ã¯ãããŸãããã¢ãã©ã€ã¶ãŒã¯ããã«æ³šç®ããŸãã
ã³ã³ãã€ã©ãæé©åããç§ã®äžçã§ã¯ãããã¯æãããªééãã§ãã ã³ã³ãã€ã©ã¯åã«ãã®ã«ãŒããã¹ããŒããé 延ã¯çºçããŸããã toutã¯éåžžã®äžæ®çºæ§å€æ°ã§ãã çµã¿èŸŒã¿ã®äžçã§ç©äºãã©ã®ããã«ãªã£ãŠããã®ãã¯ããããŸããããã³ãŒãããŸã æ£ãããªãããå°ãªããšãä¿¡é Œæ§ãäœããšæãããŸãã ã³ã³ãã€ã©ãŒããã®ãããªãµã€ã¯ã«ãã¹ããŒããªããŠããé 延ã®æç¶æéãšååã§ãããã©ããã¯æ確ã§ã¯ãããŸããã
ç§ã®ç¥ãéãããã®ãããªã·ã¹ãã ã«ã¯sleep_usã®ãããªé¢æ°ããããŸãã å°ããªé 延ã«äœ¿çšããå¿ èŠããããŸãã ã³ã³ãã€ã©ã¯ã sleep_usé¢æ°ã®åŒã³åºããéåžžã®åçŽãªã«ãŒãã«å€ããããšãã§ããŸããããããã¯å®è£ æ©èœã§ãã ãã®ãããªé 延ãµã€ã¯ã«ãæžãæã¯ããŠå±éºã§ãã
ãããã«
èªè ããåå ããŠããéçºäžã®çµã¿èŸŒã¿ã·ã¹ãã ã®ãããžã§ã¯ãããã§ãã¯ã¢ãŠãããããšããå§ãããŸãã æåã«ARMã³ã³ãã€ã©ããµããŒãããŸãããããªãŒããŒã¬ã€ãååšããå ŽåããããŸãã ãããã£ãŠãçºçãããã¹ãŠã®è³ªåããµããŒãããããã«ç§éã«é£çµ¡ããããšãheããªãã§ãã ããã
PVS-Studioã®ãã¢çã¯ãã¡ãããããŠã³ããŒãã§ããŸãã
çµã¿èŸŒã¿ã·ã¹ãã ã®å€ãã®ãããžã§ã¯ãã¯éåžžã«å°ãããã©ã€ã»ã³ã¹ãååŸããããšã¯å®éçã§ã¯ãªãããšãç解ããŠããŸãã ãã®ãããç¡æã®ã©ã€ã»ã³ã¹ãªãã·ã§ã³ãæäŸããŠããŸãã詳现ã«ã€ããŠã¯ãã PVS-Studioãç¡æã§äœ¿çšããæ¹æ³ ãã®èšäºãåç §ããŠãã ããã ç¡æã®ã©ã€ã»ã³ã¹ãªãã·ã§ã³ã®å€§ããªå©ç¹ã¯ããªãŒãã³ãªãããžã§ã¯ãã ãã§ãªããã¯ããŒãºããããžã§ã¯ãã§ã䜿çšã§ããããšã§ãã

ããªãã®æ³šæãšäžæ³šæãªããããã«æè¬ããŸãïŒ
ãµã€ããªã³ã¯
ãã®èšäºã¯ãæ°ããèŠèŽè ãé äºããŸãã ãããã£ãŠãPVS-StudioããŒã«ã«ãŸã æ £ããŠããªã人ã®ããã«ã次ã®èšäºãèªãããšããå§ãããŸãã
- ããã¥ã¡ã³ããŒã·ã§ã³ Linuxã§PVS-Studioãå®è¡ããæ¹æ³ ã
- ã¢ã³ãã¬ã€ã»ã«ã«ããã EFLã³ã¢ã©ã€ãã©ãªã®äŸã䜿çšããPVS-Studioã¢ãã©ã€ã¶ãŒã®ç¹æ§ã誀æ€ç¥ã®10ã15ïŒ ã
- ã¢ã³ãã¬ã€ã»ã«ã«ããã éçã³ãŒãåæã«é¢ããè°è« ã
- ã¢ã³ãã¬ã€ã»ã«ã«ããã PVS-Studioãããžã§ã¯ãã10幎åã«å§ãŸã£ãçµç·¯ ã
- ã¢ã³ãã¬ã€ã»ã«ã«ããã Unreal Engineéçºããã»ã¹ã®äžéšãšããŠã®éç解æ ã
- ã»ã«ã²ã€ã»ã¯ã¬ããã SonarQubeã®ãã©ã°ã€ã³ãšããŠã®PVS-Studio
- ãšãã²ããŒã»ãªãžã³ãã éçã³ãŒãåæã®å²åŠïŒããã°ã©ããŒã¯100人ããŸãããã¢ãã©ã€ã¶ãŒã¯ãšã©ãŒãã»ãšãã©èŠã€ããŸããã§ãããã圹ã«ç«ããªãã®ã§ããïŒ
- ã»ã«ã²ã€ã»ãŽã¡ã·ãªãšãã PVS-Studioã¯è匱æ§ã®æ€çŽ¢ã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
- ã¢ã³ãã¬ã€ã»ã«ã«ããã ããã°ã©ããŒãèªãã¹ãã§ã¯ãªããããŒãžã£ãŒåãã®éçã³ãŒãåæã«é¢ããèšäº ã
- ã¢ã³ãã¬ã€ã»ã«ã«ããã éçã¢ãã©ã€ã¶ãŒãåœéœæ§ãšæŠãæ¹æ³ãšçç± ã
- ãŽã»ãŽã©ããã»ã«ããããã Eclipse CDTïŒLinuxïŒã«PVS-Studioãçµã¿èŸŒã¿ãŸãã ã
- ã¢ã³ãã¬ã€ã»ã¯ãºããã©ãã PVS-StudioãAnjuta DevStudioïŒLinuxïŒã«çµã¿èŸŒã¿ãŸãã ã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey Karpovã Static Code Analyzer PVS-Studio 6.22ã¯ãARMã³ã³ãã€ã©ãŒïŒKeilãIARïŒããµããŒãããããã«ãªããŸãã ã