
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-threadRT-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; 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) #define CAN_FIFO1 ((uint8_t)0x01U) 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{ } 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
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++) { 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(....) { .... while(HAL_IS_BIT_SET(Device->SDSR, FMC_SDSR_BUSY)) { 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ïŒããµããŒãããããã«ãªããŸãã ã