PVS-Studioã®ãããªãã¯LinuxããŒãžã§ã³ã®ãªãªãŒã¹ä»¥æ¥ãLinuxã«ãŒãã«ã®åãã§ãã¯ã«é¢ããèšäºã¯æéã®åé¡ã«éããŸããã äžçäžã®å°é家ã«ãã£ãŠæžããããããžã§ã¯ãã§ãããããŸããŸãªåéã®å€æ°ã®äººã ã䜿çšããããŸããŸãªããŒã«ã§å®æçã«ãã§ãã¯ããã³ãã¹ããããŸãããã®ãããªãããžã§ã¯ãã®ãã¹ãã¯ãéçã¢ãã©ã€ã¶ãŒã«ãšã£ãŠæ·±å»ãªãã¹ãã«ãªããŸãã ãã®ãããªç¶æ³ã§PVS-Studioã¯ã©ã®ãããªãšã©ãŒãæ€åºã§ããŸããïŒ
ãã§ãã¯ãããšãã
Linuxã«ãŒãã«ã¯æ¢ã«ãã¹ãæžã¿ã§ãã ãã以æ¥ãå€ãã®å€æŽãè¡ãããŸãã-çŸåšãOSã®ãã§ãã¯ã¯ä»ã®ãããžã§ã¯ãã®ãã§ãã¯ãšåããããç°¡åã§äŸ¿å©ã§ã
pvs-studio-analyzer trace - make pvs-studio-analyzer analyze -o /path/to/report.log -j8
Linuxã§ã¢ãã©ã€ã¶ãŒãé©å¿ããã³ãã¹ãããã®ã«æ°ãæããããããŸããã§ããããæè¿ãŸã§ã¯Windowsã§ããå©çšã§ããŸããã§ããã ä»åã¯ãã«ãŒãã«ã®ãã§ãã¯ãæ¡éãã«ç°¡åã«ãªã£ãããšãããããŸããã
æ€èšŒã®ããã«ãããŒãžã§ã³4.9-rc4ïŒcommit bc33b0ca11e3df467777a4fa7639ba488c9d4911ïŒã䜿çšãããŸããã
èšäºãæžãããã«ã1-2ã¬ãã«ã®æ±çšèšºæã®ã¿ã衚瀺ãããŸããã ã³ãŒãã®é«å質ã«æ³šç®ãã䟡å€ããããŸã-å®éã®æ¬ é¥ã瀺ãèŠåã®å¯åºŠã¯éåžžã«äœãã§ãã
ãã®èšäºã§ã¯ãå®éã®ãšã©ãŒ/ã¿ã€ããã¹ã瀺ãå¯èœæ§ãæãé«ãèŠåãéžæããŸããã ã¢ãã©ã€ã¶ãŒã¯ãæçšãªèŠåã«å ããŠã誀ã£ãã¢ã©ãŒã ãçæããããèšèšãäžååãªã³ãŒãããæªèãã³ãŒããèå¥ããŸãããããã§ãæ¬åœã«èª€ã£ãŠããããã§ã¯ãããŸããã
æ®å¿µãªãããLinuxã§ã®èª€æ€ç¥ã®æ°ã¯ãç§ãã¡ãæããããå€ããªã£ãŠããŸãã ããã¯ãLinuxã·ã¹ãã çšã«èšèšãããã¢ãã©ã€ã¶ãŒããŒãžã§ã³ã®è¥è ã«ãããã®ã ãšæããŸãã ç§ãã¡ã¯ã誀æ€ç¥ã®æ°ãæå°éã«æããçŽ æŽãããä»äºãããŠããŸããã Linuxã³ãŒãã¯ãã¢ãã©ã€ã¶ãŒãæ¹åããã¢ãã©ã€ã¶ãŒã«å€ãã®äŸ¿å©ãªå€æŽãå ããã®ãå©ããŠãããŸããã
ã¿ã€ããã¹
ãšã©ãŒã®æãäžè¬çãªã«ããŽãªã¯ãäžè¬çãªã¿ã€ããã¹ãšã³ããŒããŒã¹ãã«é¢é£ããŠããŸãã 以åã«ç§ãã¡ã®èšäºãèªãã ããšããããªãããã§ã«ãããèŠãããšããããšæããŸãã ãããã¯ãããããèšèªã®ãããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã äžã®ãããããããžã§ã¯ãã«ç»å ŽããŸãã ãã®ãããªãšã©ãŒã¯ãéçã¢ãã©ã€ã¶ãŒã®å¯èœæ§ãæããã«ããŸããä»ã®ããŒã«ã§ããããèŠã€ããããšã¯ã¯ããã«å°é£ã§ãã Linuxã«ãŒãã«ã§ããããã©ã®ããã«äœ¿çšãããŠããããèŠãŠã¿ãŸãããã
PVS-StudioèŠåïŒ V581äºãã«äžŠãã§ãããifãæŒç®åã®æ¡ä»¶åŒã¯åäžã§ãã ãã§ãã¯è¡ïŒ2384ã2390ãdebug.c 2390
int dbg_check_nondata_nodes_order(....) { .... sa = container_of(cur, struct ubifs_scan_node, list); sb = container_of(cur->next, struct ubifs_scan_node, list); if (sa->type != UBIFS_INO_NODE && sa->type != UBIFS_DENT_NODE && sa->type != UBIFS_XENT_NODE) { ubifs_err(c, "bad node type %d", sa->type); ubifs_dump_node(c, sa->node); return -EINVAL; } if (sa->type != UBIFS_INO_NODE && sa->type != UBIFS_DENT_NODE && sa->type != UBIFS_XENT_NODE) { ubifs_err(c, "bad node type %d", sb->type); ubifs_dump_node(c, sb->node); return -EINVAL; } .... }
ã¢ãã©ã€ã¶ãŒã¯ã2ã€ã®åäžã®æ¡ä»¶ãé£ç¶ããŠããããšã蚎ããŸããæããã«ã2çªç®ã«saãsbã«å€æŽããã®ãå¿ããŠããŸããã ããã§ã¯ã誰ãã¯ãŒã«ãªãããžã§ã¯ãã«ã³ããŒã¢ã³ãããŒã¹ãããªããšèšãã§ããããïŒ
PVS-StudioèŠåïŒ V666é¢æ° 'strncmp'ã®3çªç®ã®åŒæ°ã調ã¹ãããšãæ€èšããŠãã ããã å€ããæåã®åŒæ°ã§æž¡ãããæååã®é·ããšäžèŽããªãå¯èœæ§ããããŸãã spectrum.c 341
static ssize_t write_file_spec_scan_ctl(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { struct ath10k *ar = file->private_data; char buf[32]; ssize_t len; int res; len = min(count, sizeof(buf) - 1); if (copy_from_user(buf, user_buf, len)) return -EFAULT; buf[len] = '\0'; mutex_lock(&ar->conf_mutex); if (strncmp("trigger", buf, 7) == 0) { .... } else if (strncmp("background", buf, 9) == 0) { res = ath10k_spectral_scan_config(ar, SPECTRAL_BACKGROUND); } else if (strncmp("manual", buf, 6) == 0) { res = ath10k_spectral_scan_config(ar, SPECTRAL_MANUAL); } else if (strncmp("disable", buf, 7) == 0) { res = ath10k_spectral_scan_config(ar, SPECTRAL_DISABLED); } else { res = -EINVAL; } mutex_unlock(&ar->conf_mutex); if (res < 0) return res; return count; }
ãšã©ãŒã®å€å žçãªåœ¢åŒïŒ2ã€ã®åŒæ°ãé¢æ°ã«æž¡ãå¿ èŠããããŸãïŒæååãžã®ãã€ã³ã¿ãŒãšãã®é·ãã å€ãã®å Žåããªãã©ã«ãåŒæ°ã§ããå Žåãã«ãŠã³ãã®é·ãã¯é 延ããæ°åã®ã¿ãæžã蟌ã¿ãŸãã ãã¥ãŒãã³ãã¡ã¯ã¿ãŒãäœçšããŸãïŒãããã¯ãã°ãã°ééããããŸãã
ã³ãŒãã®strncmpãäžåã«äžŠãã§ããŸãã ãªãã©ã«ã¯ããããã«æž¡ãããŸãã ãŸãã strncmpïŒãèæ¯ããbufã9ïŒã§é·ããæ£ããèšç®ãããŠããŸããããèæ¯ããšããåèªã¯9æåã§ã¯ãªã10æåã§æ§æãããŠããŸãã
PVS-StudioèŠåïŒ V666é¢æ° 'memcpy'ã®3çªç®ã®åŒæ°ã調ã¹ãããšãæ€èšããŠãã ããã å€ãã2çªç®ã®åŒæ°ã§æž¡ãããæååã®é·ããšäžèŽããªãå¯èœæ§ããããŸãã dpt_i2o.c 403
static void adpt_inquiry(adpt_hba* pHba) { .... memset(pHba->detail, 0, sizeof(pHba->detail)); memcpy(&(pHba->detail), "Vendor: Adaptec ", 16); memcpy(&(pHba->detail[16]), " Model: ", 8); memcpy(&(pHba->detail[24]), (u8*) &buf[16], 16); memcpy(&(pHba->detail[40]), " FW: ", 4); // <= memcpy(&(pHba->detail[44]), (u8*) &buf[32], 4); pHba->detail[48] = '\0'; /* precautionary */ .... }
å¥ã®äŸã æååãFWïŒãã¯5æåã§ã4æåã§ã¯ãããŸããã
ãã®ãããªãšã©ãŒãåãé€ãæ¹æ³ã¯ïŒ Cã§ã¯ã次ã®ãããªãã¯ãã䜿çšã§ããŸãã
#define str_len(S) (sizeof(S) / sizeof((S)[0]))
ãã ãããã®ãããªãã¯ãã䜿çšããããšèªäœãå±éºã§ããã³ã³ãã€ã©ãŒåºæã®ãã§ãã¯ãè¿œå ããŠãæž¡ãããåŒæ°ãå®éã«é åã§ããããšã確èªããããšããå§ãããŸãã
C ++ãªãŒããŒã®å Žåãstd :: string_viewããå§ãããŸããããã¯æçµçã«C ++ 17ã«ç»å ŽããŸããã ãã€ã³ã¿ãŒãšé·ãã®ãã¢ãæååé¢æ°ã«æž¡ããªãããšããå§ãããŸãã ãã ããé åã®ãµã€ãºãæåã§èšç®ããå¿ èŠãããå ŽåïŒããšãã°ãmemcpyé¢æ°ã«æž¡ãããïŒãstd :: sizeïŒarrayïŒãŸãã¯ãã®é¡äŒŒç©ã䜿çšã§ããŸãïŒãªãã©ã«ã®å Žåããµã€ãºã¯ã³ã³ãã€ã«æã«èšç®ãããŸãã
ã³ãŒãã®ç¹°ãè¿ããé¿ããã³ã³ãã€ã«æã®èšç®ã«èšèªããŒã«ïŒãã¯ããŸãã¯ãã³ãã¬ãŒãïŒã䜿çšããã®ãæ ããªãã§ãã ããïŒ
PVS-StudioèŠåïŒ V653 2ã€ã®éšåã§æ§æãããçãããæååã¯ãé åã®åæåã«äœ¿çšãããŸãã ã³ã³ããæ¬ èœããŠããå¯èœæ§ããããŸãã ãã®ãªãã©ã«ã®æ€æ»ãæ€èšããŠãã ããïŒ "30min" "No timeout"ã lp8788-charger.c 657
static ssize_t lp8788_show_eoc_time(struct device *dev, struct device_attribute *attr, char *buf) { struct lp8788_charger *pchg = dev_get_drvdata(dev); char *stime[] = { "400ms", "5min", "10min", "15min", "20min", "25min", "30min" "No timeout" }; .... }
ãåç¥ã®ããã«ãè¡ã«èšè¿°ããã2ã€ã®ãªãã©ã«ã¯é£çµãããŠããŸãã ããã«ããããã¯ããªã©ã§äŸ¿å©ã«äœ¿çšã§ããŸãã ãã®ãããªãªãã©ã«ã®é åãäœæãããšãå±éºãçããŸããã³ã³ããã¹ãããããŠãäºæããªãçµæãåŸãããšãã§ããŸãã
ãã®å ŽåãæåŸã®2ã€ã®ãªãã©ã«ã¯ãçµåãããã30minNoã¿ã€ã ã¢ãŠãããååŸããŸãã ããã¯äºéã®ééãã§ãã ãŸããããã¹ããæ£ãããããŸããã次ã«ãé åå ã®1ã€ã®èŠçŽ ãæ¬ èœããŠãããããé åãæµåºããå¯èœæ§ããããŸãã
å¥ã®ãã©ãŒãããæ¹æ³ã䜿çšããããšããå§ãããŸãããã®ãããªãšã©ãŒã¯é¡èã«ãªããŸãã
char *stime[] = { "400ms" , "5min" , "10min" , "15min" , "20min" , "25min" , "30min" "No timeout" };
ç§ã®ååã®Andrei Karpovã¯ããã®è¡šåœ¢åŒã³ãŒãèšèšã®æ¹æ³ã«ã€ããŠè©³ããæžããŠããŸãã ç§ã¯åœŒã®å°ããªæ¬ããN13ç« ãèªãããšãææ¡ããŸãã
PVS-Studio èŠå ïŒ V764 ãahc_9005_subdevinfo_validãé¢æ°ã«æž¡ãããåŒæ°ã®èª€ã£ãé åºã®å¯èœæ§ïŒãããã€ã¹ãããã³ããã³ããŒãã aic7xxx_pci.c 695
const struct ahc_pci_identity * ahc_find_pci_device(ahc_dev_softc_t pci) { .... if (ahc_get_pci_function(pci) > 0 && ahc_9005_subdevinfo_valid(device, vendor, // <= subdevice, subvendor) && SUBID_9005_MFUNCENB(subdevice) == 0) return (NULL); .... }
ã¢ãã©ã€ã¶ãŒãäœãèªãããç解ããã®ãé£ããå ŽåããããŸãã ã¡ãªã¿ã«ãããã¯ããèµ·ãããŸãïŒåæè ã圌ã«æžãããã®ã人ãç解ããããåœéœæ§ãã®ã¬ããŒããç§ãã¡ã«éããŸããããå®éã«ã¯ãšã©ãŒããããŸãã ããã§ã¯ãããã¯èª€æ€ç¥ã§ããããã«æãããŸãããé¢æ°ã¯ã³ãŒãå ã§å°ãé«ãå®çŸ©ãããŠããããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãèšå®ãããŠããŸãã ããã¯æ¬¡ã®ãããªãã®ã§ãã
static int ahc_9005_subdevinfo_valid(uint16_t device, uint16_t vendor, uint16_t subdevice, uint16_t subvendor) { .... }
åé¡ã¯äœã§ããïŒ ãã®é¢æ°ã®å®£èšã¯ããã«é«ãããããã®åŒæ°ã¯ããã§æ··åãããŠããããšãããããŸãã å®éãããã°ã©ã ã®ããžãã¯ã«ã¯äœãåé¡ã¯ãããŸãããã誰ãæ··ä¹±ããããæ··ä¹±ããããããªãããã«ä¿®æ£ããããšããå§ãããŸãã
static int ahc_9005_subdevinfo_valid(uint16_t vendor, uint16_t device, uint16_t subvendor, uint16_t subdevice);
ãããé¢çœãã®ã¯ãããã§ã®ãšã©ãŒã¯ãã§ã«ãã£ããšããããšã§ãããã©ã¡ãŒã¿ãŒãæ¬åœã«æ··åãããŠããŠãåºåãä¿®æ£ããã®ãå¿ããŠããŸããã ã¢ãã©ã€ã¶ãŒããã®å ŽæãèŠã€ããã®ã¯è¯ãããšã§ãã
èŠåPVS-StudioïŒ V549 'memcpy'é¢æ°ã®æåã®åŒæ°ã¯2çªç®ã®åŒæ°ãšåãã§ãã wilc_wfi_cfgoperations.c 1345
static int del_pmksa(struct wiphy *wiphy, struct net_device *netdev, struct cfg80211_pmksa *pmksa) { .... for (; i < (priv->pmkid_list.numpmkid - 1); i++) { memcpy(priv->pmkid_list.pmkidlist[i].bssid, priv->pmkid_list.pmkidlist[i + 1].bssid, ETH_ALEN); memcpy(priv->pmkid_list.pmkidlist[i].pmkid, priv->pmkid_list.pmkidlist[i].pmkid, PMKID_LEN); } .... }
æåŸã®memcpyã¯ãã€ã³ã¿ãŒã«äžèŽããŸãã ããããã圌ãã¯åã®è¡šçŸãšã®é¡æšã§æžããããšæã£ãã§ãããã
memcpy(priv->pmkid_list.pmkidlist[i].pmkid, priv->pmkid_list.pmkidlist[i + 1].pmkid, PMKID_LEN);
æªäœ¿çšã®å€æ°
PVS-StudioèŠåïŒ V575 ãstrncasecmpãé¢æ°ã¯ã0ãèŠçŽ ãåŠçããŸãã 3çªç®ã®åŒæ°ã調ã¹ãŸãã linux_wlan.c 1121
static int mac_ioctl(struct net_device *ndev, struct ifreq *req, int cmd) { u8 *buff = NULL; s8 rssi; u32 size = 0, length = 0; struct wilc_vif *vif; s32 ret = 0; struct wilc *wilc; vif = netdev_priv(ndev); wilc = vif->wilc; if (!wilc->initialized) return 0; switch (cmd) { case SIOCSIWPRIV: { struct iwreq *wrq = (struct iwreq *)req; size = wrq->u.data.length; if (size && wrq->u.data.pointer) { buff = memdup_user(wrq->u.data.pointer, wrq->u.data.length); if (IS_ERR(buff)) return PTR_ERR(buff); if (strncasecmp(buff, "RSSI", length) == 0) { // <= .... } } } .... } done: kfree(buff); return ret; }
strncasecmpé¢æ°ã«ã¯ãé·ãã®åŒæ°ãšããŠ0ãæž¡ãããŸããã ã³ãŒãå ã«å¯å€é·ãå€ããå Žæã¯ãªãããããã®å€ã¯ãŒãã®ãŸãŸã§ãã ããããsizeã䜿çšããå¿ èŠããããŸãã
PVS-StudioèŠåïŒ V751ãã©ã¡ãŒã¿ãŒãLCDheightãã¯é¢æ°æ¬äœå ã§ã¯äœ¿çšãããŸããã init.c 339
static unsigned short SiS_GetModeID(int VGAEngine, unsigned int VBFlags, int HDisplay, int VDisplay, int Depth, bool FSTN, int LCDwidth, int LCDheight) { unsigned short ModeIndex = 0; switch(HDisplay) { case 320: if(VDisplay == 200) ModeIndex = ModeIndex_320x200[Depth]; else if(VDisplay == 240) { if((VBFlags & CRT2_LCD) && (FSTN)) ModeIndex = ModeIndex_320x240_FSTN[Depth]; else ModeIndex = ModeIndex_320x240[Depth]; } break; case 400: if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 800) && (LCDwidth >= 600))) { // <= if(VDisplay == 300) ModeIndex = ModeIndex_400x300[Depth]; } break; case 512: if((!(VBFlags & CRT1_LCDA)) || ((LCDwidth >= 1024) && (LCDwidth >= 768))) { // <= if(VDisplay == 384) ModeIndex = ModeIndex_512x384[Depth]; } break; .... } return ModeIndex; }
é¢æ°ã§åžžã«æªäœ¿çšã§ãããšã¯éããªããã©ã¡ãŒã¿ãŒã¯ãšã©ãŒã§ãã ããªãå€ãAPIã§ã¯ããã©ã¡ãŒã¿ãŒãäžèŠã«ãªããäžæžããããããåã«äœ¿çšãããªãç¶æ³ãçºçããŸãã ãããããã®æçã詳ããèŠãŠã¿ãŸããããããã§ã¯ãé«ããæ¯èŒããã®ãå¿ããŠããŸããã 代ããã«ã ãïŒA> 5ïŒ&&ïŒA> 3ïŒããšãã圢åŒã®æ¯èŒãç»å ŽããŸããã ãããèªäœã¯åé·ã§ãã
æäœã®åªå é äœã«é¢ããæ··ä¹±
èŠåPVS-StudioïŒ V502 ãïŒïŒãæŒç®åã¯ãäºæ³ãšã¯ç°ãªãæ¹æ³ã§åäœããå¯èœæ§ããããŸãã ãïŒïŒãæŒç®åã®åªå é äœã¯ã|ããããäœã æŒç®åã core.c 1046
static int nvme_pr_preempt(struct block_device *bdev, u64 old, u64 new, enum pr_type type, bool abort) { u32 cdw10 = nvme_pr_type(type) << 8 | abort ? 2 : 1; return nvme_pr_command(bdev, cdw10, old, new, nvme_cmd_resv_acquire); }
Cã®äžé æŒç®åã¯éåžžã«å±éºãªæŒç®åã§ãã PVS-Studioã®æåã®æ±çšèšºæã®1ã€ã圌ã«æ§ããããŠããã ãã§ã¯ãããŸããã äºå®ã圌ã®åªå 床ã¯äœããè€éãªåŒã§ã¯æ··ä¹±ãããããèšç®ã®é åºããŸã£ããç°ãªããŸãã ãããã£ãŠãçåãããå Žåã¯æ¬åŒ§ã䜿çšããããšããå§ãããŸãã
çããããã§ãã¯
PVS-Studio èŠå ïŒ V517 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ375ã377ãtrx.c 375
bool rtl92ee_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *status, struct ieee80211_rx_status *rx_status, u8 *pdesc, struct sk_buff *skb) { struct rtl_priv *rtlpriv = rtl_priv(hw); struct rx_fwinfo *p_drvinfo; struct ieee80211_hdr *hdr; u32 phystatus = GET_RX_DESC_PHYST(pdesc); .... status->macid = GET_RX_DESC_MACID(pdesc); if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc)) status->wake_match = BIT(2); else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc)) status->wake_match = BIT(1); else if (GET_RX_STATUS_DESC_UNICAST_MATCH(pdesc)) status->wake_match = BIT(0); else status->wake_match = 0; .... }
åŽããèŠããšãããã§äœãééã£ãŠããã®ããç解ããããšã¯å°é£ã§ãã ãã¯ãGET_RX_STATUS_DESC_MAGIC_MATCHã䜿çšããŠãåããã§ãã¯ã2åè¡ãããŸãã 圌ã®åºåãèŠããšãä»ã®2ã€ã®ãã¯ãã衚瀺ãããŸãã
#define GET_RX_STATUS_DESC_PATTERN_MATCH(__pdesc) LE_BITS_TO_4BYTE(__pdesc+12, 29, 1) #define GET_RX_STATUS_DESC_UNICAST_MATCH(__pdesc) LE_BITS_TO_4BYTE(__pdesc+12, 30, 1) #define GET_RX_STATUS_DESC_MAGIC_MATCH(__pdesc) LE_BITS_TO_4BYTE(__pdesc+12, 31, 1)
ãããããå ã®ãã©ã°ã¡ã³ãã§æ¬ èœããŠããGET_RX_STATUS_DESC_PATTERN_MATCHã䜿çšãããã£ãã®ã§ãããã ãã以å€ã®å Žåããã®ãã§ãã¯ã¯åã«ç¡æå³ã§ãã
PVS-Studio èŠå ïŒ V547åŒ 'ïŒptr [3]ïŒ0x1EïŒïŒ= 0x03'ã¯åžžã«trueã§ãã sd.c 4115
int ext_sd_send_cmd_get_rsp(struct rtsx_chip *chip, u8 cmd_idx, u32 arg, u8 rsp_type, u8 *rsp, int rsp_len, bool special_check) { int retval; int timeout = 100; u16 reg_addr; u8 *ptr; .... if (cmd_idx == SELECT_CARD) { if (rsp_type == SD_RSP_TYPE_R2) { if ((ptr[3] & 0x1E) != 0x04) { rtsx_trace(chip); return STATUS_FAIL; } } else if (rsp_type == SD_RSP_TYPE_R0) { if ((ptr[3] & 0x1E) != 0x03) { // <= rtsx_trace(chip); return STATUS_FAIL; } } } .... }
ãšã©ãŒã¯ãããæäœã«é¢é£ããŠããŸãã 1ãããã«èµ·å ãã0x1Eãšã®ãããããšã®çµåã®çµæã¯ãå€0x03ãšæ±ºããŠçãããªããŸããã
PVS-Studio èŠå ïŒ V517 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã ãã§ãã¯è¡ïŒ1277ã1282ãks_wlan_net.c 1277
static int ks_wlan_set_power(struct net_device *dev, struct iw_request_info *info, struct iw_param *vwrq, char *extra) { struct ks_wlan_private *priv = (struct ks_wlan_private *)netdev_priv(dev); short enabled; if (priv->sleep_mode == SLP_SLEEP) { return -EPERM; } /* for SLEEP MODE */ enabled = vwrq->disabled ? 0 : 1; if (enabled == 0) { /* 0 */ priv->reg.powermgt = POWMGT_ACTIVE_MODE; } else if (enabled) { /* 1 */ if (priv->reg.operation_mode == MODE_INFRASTRUCTURE) priv->reg.powermgt = POWMGT_SAVE1_MODE; else return -EINVAL; } else if (enabled) { /* 2 */ if (priv->reg.operation_mode == MODE_INFRASTRUCTURE) priv->reg.powermgt = POWMGT_SAVE2_MODE; else return -EINVAL; } else return -EINVAL; hostif_sme_enqueue(priv, SME_POW_MNGMT_REQUEST); return 0; }
äŸã次ã®ããã«æžãããŸãã
enabled = vwrq->disabled ? 0 : 1; if (enabled == 0) { /* 0 */ .... } else if (enabled) { /* 1 */ .... } else if (enabled) { /* 2 */ .... } else ....
ãã®ã³ãŒãã¯éåžžã«å¥åŠã«èŠããŸãã å€ã®ç¯å²ã¯äžèšã®åŒã«ãã£ãŠæ確ã«ããŽã·ãšãŒããããŠããããã§ãïŒ enabledã¯0ãŸãã¯1ã§ãã ãã ããæ倧4ã€ã®å€ããã§ãã¯ãããŸãã åæã«ãã³ã¡ã³ãã¯å¹²æžããã ãã§ããæ°å€ãå€æ°ã®å¯èœãªå€ã瀺ãå Žåã¯ãå®éã«ã¯å¯Ÿå¿ããŠããŸããã1ãš2ã®ãã§ãã¯ã¯åãæ¹æ³ã§æžã蟌ãŸããŸãã
PVS-Studio èŠå ïŒ V517 ãifïŒAïŒ{...} else ifïŒAïŒ{...}ããã¿ãŒã³ã®äœ¿çšãæ€åºãããŸããã è«çãšã©ãŒãååšããå¯èœæ§ããããŸãã è¡ã確èªããŠãã ããïŒ422ã424ãHal8188ERateAdaptive.c 422
static int odm_ARFBRefresh_8188E( struct odm_dm_struct *dm_odm, struct odm_ra_info *pRaInfo) { /* Wilson 2011/10/26 */ .... if (pRaInfo->HighestRate > 0x13) pRaInfo->PTModeSS = 3; else if (pRaInfo->HighestRate > 0x0b) pRaInfo->PTModeSS = 2; else if (pRaInfo->HighestRate > 0x0b) pRaInfo->PTModeSS = 1; else pRaInfo->PTModeSS = 0; .... return 0; }
2ã€ã®æ¡ä»¶ãé£ç¶ããå¥ã®å Žæã ããã£ãç°ãªãããšã«æ³šæããŠãã ããã ããã«æ¬åœã®ééããããã®ãââããããšãæªäœ¿çšã®ã³ãŒããªã®ããèšãã®ã¯å°é£ã§ããããã¯ãã§ã«ãããžã§ã¯ãéçºè ã®ä»äºã§ãã ã¢ãã©ã€ã¶ãŒã®ã¿ã¹ã¯ã¯ãçãããå Žæã«æ³šæãæãããšã§ãã
èŠåPVS-StudioïŒ V734éå°ãªãã§ãã¯ã ãµãã¹ããªã³ã°ãinterleaverãããã³ãdeinterleaverãã®æ€çŽ¢ãå«ãæ¡ä»¶ã調ã¹ãŸãã sst-atom-controls.c 1449
static int sst_fill_widget_module_info( struct snd_soc_dapm_widget *w, struct snd_soc_platform *platform) { struct snd_kcontrol *kctl; int index, ret = 0; struct snd_card *card = platform->component.card->snd_card; char *idx; down_read(&card->controls_rwsem); list_for_each_entry(kctl, &card->controls, list) { .... } else if (strstr(kctl->id.name, "interleaver")) { struct sst_enum *e = (void *)kctl->private_value; e->w = w; } else if (strstr(kctl->id.name, "deinterleaver")) { struct sst_enum *e = (void *)kctl->private_value; e->w = w; } .... } up_read(&card->controls_rwsem); return 0; }
ãã®ãã©ã°ã¡ã³ãã§ã¯ã1è¡ã«ããã€ãã®ãµãã¹ããªã³ã°ãååšãããã©ãããé£ç¶ããŠãã§ãã¯ãããŸãã ããããããããããã«ãèå³ã®ããéšåæååã®ã¿ãæ®ããŸããã ã€ã³ã¿ãŒãªãŒããŒãèŠã€ãããªãã£ãå Žåã ã€ã³ã¿ãŒãªãŒããŒã®ãµãã¹ããªã³ã°ãå®å šã«ãªããªã£ãŠããããã deinterleaverãæ¢ãããšã¯æå³ããããŸããã ãããã£ãŠããã®ã³ãŒãã»ã¯ã·ã§ã³ã¯æ©èœããŸããããifãšelseã®æ¬äœãåãã§ãããããããã¯æããããŸããã ããã¯åãªãåé·ã³ãŒãã§ãã
PVS-Studioã® èŠå ïŒ V547åŒããããã¯ãã¯åžžã«çã§ãã svclock.c 873
void nlmsvc_grant_reply(struct nlm_cookie *cookie, __be32 status) { struct nlm_block *block; dprintk("grant_reply: looking for cookie %x, s=%d \n", *(unsigned int *)(cookie->data), status); if (!(block = nlmsvc_find_block(cookie))) return; if (block) { if (status == nlm_lck_denied_grace_period) { /* Try again in a couple of seconds */ nlmsvc_insert_block(block, 10 * HZ); } else { /* Lock is now held by client, or has been rejected. * In both cases, the block should be removed. */ nlmsvc_unlink_block(block); } } nlmsvc_release_block(block); }
ãã®äŸã¯ã ASTããã€ãã¹ããŠãéçã¢ãã©ã€ã¶ãŒããã¿ãŒã³ããŒã¹ã®åæãå®è¡ããã®ã«ååã§ãªãçç±ã瀺ããŠããŸãã å¶åŸ¡ãããŒåæãšããŒã¿ãããŒåæãå®è¡ã§ããããšãéèŠã§ãã block == NULLã®æç¹ã§æ»ããçºçãããããã³ãŒããããã«äžã«ç§»åãããšããã€ã³ã¿ãŒããŒã以å€ã§ããããšã確èªã§ããŸãã ãããŠã NULLã®ãã§ãã¯ã«ééãããšãããã§äœããééã£ãŠããããšãæ確ã«ç解ããŸãã
ããã§ã¯ã2çªç®ã®ãã€ã³ã¿ãŒãã§ãã¯ã¯äžèŠãªããã§ãã ãã ããããã§å¥ã®å€æ°ã確èªãããå Žåã¯ã©ãã§ããããïŒ èª°ãç¥ã£ãŠããã...åæè ã¯ãæ€èšŒã®ããã«ãã®ã³ãŒããéçºè ã«æ確ã«æäŸãã¹ãã§ãã
åæ§ã®ç¶æ³ïŒ
PVS-StudioèŠåïŒ V547åŒ 'sym'ã¯åžžã«çã§ãã menu.c 498
bool menu_is_visible(struct menu *menu) { struct menu *child; struct symbol *sym; .... if (!sym || sym_get_tristate_value(menu->sym) == no) // <= return false; for (child = menu->list; child; child = child->next) { if (menu_is_visible(child)) { if (sym) // <= sym->flags |= SYMBOL_DEF_USER; return true; } } return false; }
ãã¯ããšã©ãŒ
èŠåPVS-StudioïŒ V733ãã¯ããå±éããçµæãè©äŸ¡é åºãééã£ãŠããå¯èœæ§ããããŸãã åŒã確èªããŠãã ããïŒrequest-> rq_timeout + 5 *1000ãniobuf.c 637
#define CFS_FAIL_TIMEOUT(id, secs) \ cfs_fail_timeout_set(id, 0, secs * 1000, CFS_FAIL_LOC_NOSET) #define OBD_FAIL_TIMEOUT(id, secs) \ CFS_FAIL_TIMEOUT(id, secs) int ptl_send_rpc(struct ptlrpc_request *request, int noreply) { .... OBD_FAIL_TIMEOUT(OBD_FAIL_PTLRPC_DELAY_SEND, request->rq_timeout + 5); .... }
ãããããã®ãããªãšã©ãŒã¯éåžžã«ãŸãã§ãã ãã®åã«ãç§ã¯å®éã®ãããžã§ã¯ãã§ãã®èšºæã®æäœã1ã€ã ãèŠãŸããããããFreeBSDã ã£ãããšã¯æ³šç®ã«å€ããŸã ã ãã¯ãã®å®çŸ©ã«èª€ãããããŸããããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãè§æ¬åŒ§ã§å²ãã®ãæåã§ãã ãããè¡ãããªãå Žåã次ã®ã±ãŒã¹ãèããããŸãããsec + 1000ãããx + 5ãã«çœ®ãæãããšããx + 5 * 1000ããåŸãããŸãããããã¯æããã«èè ãæåŸ ãããã®ã§ã¯ãããŸããã
æå³ã®ãªãmemset
PVS-StudioèŠåïŒ V597ã³ã³ãã€ã©ã¯ããpsããããã¡ããã©ãã·ã¥ããããã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã ãã©ã€ããŒãããŒã¿ãæ¶å»ããã«ã¯ãmemset_sïŒïŒé¢æ°ã䜿çšããå¿ èŠããããŸãã atom.c 1383
int amdgpu_atom_asic_init(struct atom_context *ctx) { int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR); uint32_t ps[16]; int ret; memset(ps, 0, 64); ps[0] = cpu_to_le32(CU32(hwi + ATOM_FWI_DEFSCLK_PTR)); ps[1] = cpu_to_le32(CU32(hwi + ATOM_FWI_DEFMCLK_PTR)); if (!ps[0] || !ps[1]) return 1; if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT)) return 1; ret = amdgpu_atom_execute_table(ctx, ATOM_CMD_INIT, ps); if (ret) return ret; memset(ps, 0, 64); // <= return ret; }
æ»ãåã«memsetãè¿œå ããŠãæå³ããããŸãããã³ã³ãã€ã©ã¯ããã®æäœã«ãã£ãŠããã°ã©ã ã®è¡šç€ºç¶æ ãå€æŽãããªãããšã確èªãïŒé åã¯ãŸã ã¹ã³ãŒãå€ã«ãªããŸãïŒãåé€ããŸãã éèŠãªããŒã¿ãæ¶å»ããå¿ èŠãããå Žåã¯ã memset_sã䜿çšããããç¬èªã®ã¢ããã°ãäœæããå¿ èŠããããŸãã
ãšããã§ããã®ãšã©ãŒã¯å®éã«ã¯è匱æ§ã§ãã äžæžããããããŒã¿ã¯äžæžããããŸããã 詳现ã¯ã V597蚺æã®èª¬æã«èšèŒãããŠããŸãã ãšããã§ãããã¯éåžžã«äžè¬çãªè匱æ§ã§ãïŒ èšŒæ ã
memcmpã®å±éºãªäœ¿çš
PVS-StudioèŠåïŒ V642 ãmemcmpãé¢æ°ã®çµæããunsigned charãåå€æ°ã«ä¿åããã®ã¯äžé©åã§ãã ããã°ã©ã ã®ããžãã¯ãå£ããŠãéèŠãªãããã倱ãããå¯èœæ§ããããŸãã host.c 1789
static void power_control_timeout(unsigned long data) { .... u8 other = memcmp(requester->frame_rcvd.iaf.sas_addr, iphy->frame_rcvd.iaf.sas_addr, sizeof(requester->frame_rcvd.iaf.sas_addr)); if (other == 0) { .... } .... }
è¿ãããmemcmpå€ã«é¢ããããã¥ã¡ã³ãã®èª¬æã泚ææ·±ãèªããšãç¹å®ã®ç¯å²ã«ã€ããŠã®ä¿èšŒããªãããšãããããŸããé¢æ°ã¯ãã®åå ã®ä»»æã®æ°ãè¿ãããšãã§ããŸãã ãããŠãããã¯åžžã«-1ã0ã1ã§ã¯ãããŸããã ãããã£ãŠããã®å€ãããå°ããªåã®å€æ°ã«æ ŒçŽããããšã¯äžå¯èœã§ããæäžäœã®æ¡ã倱ããããšãè¥ãæ¡ã¯ãŒãã«ãªãå¯èœæ§ããããŸãã åæ§ã®ãšã©ãŒãMySQL / MariaDBã«è匱æ§ããããããŸããã
ãããã«
æ¢ã«è¿°ã¹ãããã«ãLinuxã¯éåžžã«é«å質ã§ååã«ãã¹ãããããããžã§ã¯ãã§ãã ããã«ééããèŠã€ããããšã¯ãæãäºçŽ°ãªããšã§ããããã§ã«èªãã®çç±ã§ãã ããã¯ããããã°ããã³ãã¹ãã®åã«æ€åºã§ãããšã©ãŒã®æ°ãèæ ®ããçç±ã§ããããŸããéçåæãéèŠãªã®ã¯ãã®åœ¹å²ã§ãã ããã確èªããã«ã¯ãPVS-Studioãè©ŠããŠãã ããã Linuxã®å Žåã¯ãã¡ãŒã«ã§ãåãåããããã ããšãã¢ãã©ã€ã¶ãŒã®è©Šçšçãå ¥æã§ããŸãã ãŸããéå¶å©ãããžã§ã¯ãã®å Žåã¯ãPVS-Studioãç¡æã§äœ¿çšã§ããŸãã ãã®èšäºã«ç²ŸéãããªãŒãã³ã§ç¡æã®ãŠãŒãã£ãªãã£how-to-use-pvs-studio-freeã䜿çšããŠãã ãã ã
ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒPavel Belikovã Linuxã«ãŒãã«ãPVS-Studioã®LinuxããŒãžã§ã³ã§ãã¹ãæžã¿
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã