QEMUã¯ãããªãããç¥ãããŠãããšãã¥ã¬ãŒã·ã§ã³ã¢ããªã±ãŒã·ã§ã³ã§ããéçåæã¯ãQEMUã®ãããªè€éãªãããžã§ã¯ãã®éçºè ããšã©ãŒãæ©æã«çºèŠããäžè¬çã«ãã®å質ãšä¿¡é Œæ§ãåäžãããã®ã«åœ¹ç«ã¡ãŸãããã®èšäºã§ã¯ãQEMUã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã§ãPVS-StudioéçåæããŒã«ã䜿çšããŠæœåšçãªè匱æ§ãšãšã©ãŒããã§ãã¯ããŸãã
QEMUã¯ããã©ãããã©ãŒã éã§ããŒããŠã§ã¢ããšãã¥ã¬ãŒãããããã«èšèšãããç¡æã®ãœãããŠã§ã¢ã§ããããã«ãããã¿ãŒã²ãããšã¯ç°ãªãããŒããŠã§ã¢ãã©ãããã©ãŒã ã§ã¢ããªã±ãŒã·ã§ã³ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãå®è¡ã§ããŸããããšãã°ãMIPSçšã«äœæãããã¢ããªã±ãŒã·ã§ã³ãx86ã¢ãŒããã¯ãã£ã§å®è¡ã§ããŸããQEMUã¯ããããªã«ãŒããusbãªã©ã®ããŸããŸãªåšèŸºæ©åšã®ãšãã¥ã¬ãŒã·ã§ã³ããµããŒãããŠããŸãããã®ãããžã§ã¯ãã¯éåžžã«è€éã§æ³šç®ã«å€ãããã®ã§ãããéçåæã®å¯Ÿè±¡ãšãªããããžã§ã¯ãã§ãããããPVS-Studioã䜿çšããŠã³ãŒãããã§ãã¯ããããšã«ããŸããã
åæã«ã€ããŠ
ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã¯ãgithubã®ãã©ãŒããååŸã§ããŸãããããžã§ã¯ãã¯éåžžã«å€§ãããããŸããŸãªãã©ãããã©ãŒã çšã«ã³ã³ãã€ã«ã§ããŸããã³ãŒããã§ãã¯ãç°¡åã«ããããã«ãPVS-Studioã³ã³ãã€ã«ç£èŠã·ã¹ãã ã䜿çšããŸãããã®ã·ã¹ãã ã¯ãéçåæãã»ãŒãã¹ãŠã®ãã«ããã©ãããã©ãŒã ã«éåžžã«ç°¡åã«çµ±åã§ããããã«èšèšãããŠããŸãããã®ã·ã¹ãã ã¯ããã«ãäžã®ã³ã³ãã€ã©åŒã³åºãã®è¿œè·¡ã«åºã¥ããŠããããã®åŸã®ãã¡ã€ã«åæã®ããã«ãã¹ãŠã®æ å ±ãåéã§ããŸããã€ãŸãããã«ããéå§ããPVS-Studioãå¿ èŠãªæ å ±ãåéããŠãããåæãéå§ããŸãããã¹ãŠãç°¡åã§ãã詳现ã¯äžèšã®ãªã³ã¯ã«ãããŸãã
確èªããåŸãã¢ãã©ã€ã¶ãŒã¯å€ãã®æœåšçãªåé¡ãçºèŠããŸãããæ±çšèšºæïŒäžè¬åæïŒã®å Žåã1940é«ã1996äžã9596äœãåŸãããŸããããã¹ãŠã®èŠåã確èªããåŸãæåã®ä¿¡é Œã¬ãã«ïŒé«ïŒã®èšºæã«çŠç¹ãåœãŠãããšã決å®ãããŸããããã®ãããªèŠåã¯ããªãå€ãçºèŠãããŸãããïŒ1940ïŒãã»ãšãã©ã®èŠåã¯åãã¿ã€ãã§ããããçããããã¯ãã®ç¹°ãè¿ã䜿çšã«é¢é£ããŠããŸããããšãã°ããã¯ãg_newã«ã€ããŠèããŠã¿ãŸãã
#define g_new(struct_type, n_structs)
_G_NEW (struct_type, n_structs, malloc)
#define _G_NEW(struct_type, n_structs, func) \
(struct_type *) (G_GNUC_EXTENSION ({ \
gsize __n = (gsize) (n_structs); \
gsize __s = sizeof (struct_type); \
gpointer __p; \
if (__s == 1) \
__p = g_##func (__n); \
else if (__builtin_constant_p (__n) && \
(__s == 0 || __n <= G_MAXSIZE / __s)) \
__p = g_##func (__n * __s); \
else \
__p = g_##func##_n (__n, __s); \
__p; \
}))
ãã®ãã¯ãã䜿çšãããã³ã«ãã¢ãã©ã€ã¶ãŒã¯èŠåV773ãçºè¡ããŸãïŒã__pããã€ã³ã¿ãŒã®å¯èŠã¹ã³ãŒããã¡ã¢ãªãŒã解æŸããã«çµäºããŸãããã¡ã¢ãªãŒãªãŒã¯ãçºçããå¯èœæ§ããããŸãïŒãg_newãã¯ãã¯glibã©ã€ãã©ãªã§å®çŸ©ããã_G_NEWãã¯ãã䜿çšãããã®ãã¯ãã¯å¥ã®ãã¯ãG_GNUC_EXTENSIONã䜿çšããŸããããã¯ã GCCã³ã³ãã€ã©ã«éæšæºã³ãŒãã«é¢ããèŠåãã¹ãããããããã«æ瀺ããŸããã¢ãã©ã€ã¶ãŒã®èŠåãçºçãããã®ã¯ãã®éæšæºã³ãŒãã§ããæåŸãã2çªç®ã®è¡ã«æ³šæããŠãã ãããäžè¬çã«ããã¯ãã¯æ©èœããŠããŸãããã®ã¿ã€ãã®èŠåã¯848件ãããŸãããã€ãŸããã¢ã©ãŒãã®ã»ãŒååãã³ãŒãå ã®1ãæã§çºçããŸãã
ãããã®äžèŠãªèŠåã¯ãã¹ãŠç°¡åã«åé€ã§ããŸãã¢ãã©ã€ã¶ãŒèšå®ã䜿çšããŸãããã ãããã®èšäºã®å·çäžã«çºçãããã®ç¹å®ã®ã±ãŒã¹ãããã®ãããªç¶æ³ã«åãããŠã¢ãã©ã€ã¶ãŒããžãã¯ããããã«å€æŽããçç±ã§ãã
ãããã£ãŠãèŠåã®æ°ãå€ããããšãã£ãŠãå¿ ãããã³ãŒãã®å質ãæªããšã¯éããŸãããããããæ¬åœã«çãããå Žæãããã€ããããŸããããŠãèŠåã«åãæãããŸãããã
èŠå
N1V517'ifïŒAïŒ{...} else ifïŒAïŒ{...} 'ãã¿ãŒã³ã®äœ¿çšãæ€åºãããŸãããè«çãšã©ãŒãååšããå¯èœæ§ããããŸãããã§ãã¯ã©ã€ã³ïŒ2395ã2397ãmegasas.c 2395
#define MEGASAS_MAX_SGE 128 /* Firmware limit */
....
static void megasas_scsi_realize(PCIDevice *dev, Error **errp)
{
....
if (s->fw_sge >= MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE) {
....
} else if (s->fw_sge >= 128 - MFI_PASS_FRAME_SIZE) {
....
}
....
}
ã³ãŒãã§ã®ãéæ³ã®ãæ°åã®äœ¿çšã¯åžžã«çããããã®ã§ããããã«ã¯2ã€ã®æ¡ä»¶ããããäžèŠç°ãªãããã«èŠããŸãããMEGASAS_MAX_SGEãã¯ãã®å€ãèŠããšãæ¡ä»¶ãéè€ããŠããããšãããããŸããã»ãšãã©ã®å Žåãããã«ã¿ã€ããã¹ãããã128ã®ä»£ããã«å¥ã®çªå·ãããã¯ãã§ãããã¡ãããããã¯ãã¹ãŠã®ãéæ³ã®ãæ°åã®åé¡ã§ããããããã䜿çšãããšãã«å°å°ããã ãã§ååã§ãããã®å Žåããã¯ããšå®æ°ã䜿çšãããšãéçºè ã«å€§ãã«åœ¹ç«ã¡ãŸãã
èŠå
N2V523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ãã cp0_helper.c 383
target_ulong helper_mftc0_cause(CPUMIPSState *env)
{
....
CPUMIPSState *other = mips_cpu_map_tc(env, &other_tc);
if (other_tc == other->current_tc) {
tccause = other->CP0_Cause;
} else {
tccause = other->CP0_Cause;
}
....
}
æ€èšäžã®ã³ãŒãã§ã¯ãæ¡ä»¶æŒç®åã®thenæ¬äœãšelseæ¬äœã¯åãã§ããã»ãšãã©ã®å Žåãããã«ã³ããŒããŠè²Œãä»ããŸãããã ãããã£ã³ããŒãããã®åŸãã©ã³ããå¿ããä¿®æ£ããä»ã®ãªããžã§ã¯ãã®ä»£ããã«envã䜿çšãããã¹ãã§ãããšæ³å®ã§ããŸãããã®çãããå Žæã®ä¿®æ£ã¯æ¬¡ã®ããã«ãªããŸãã
if (other_tc == other->current_tc) {
tccause = other->CP0_Cause;
} else {
tccause = env->CP0_Cause;
}
ãã®ã³ãŒãã®éçºè ã ãããå®éã«ã©ãããã¹ãããæ確ã«èšãããšãã§ããŸããå¥ã®åæ§ã®å ŽæïŒ
- V523ãthenãã¹ããŒãã¡ã³ãã¯ãelseãã¹ããŒãã¡ã³ããšåçã§ããtranslate.c 641
èŠå
N3V547åŒ 'ret <0'ã¯åžžã«falseã§ããqcow2-cluster.c 1557
static int handle_dependencies(....)
{
....
if (end <= old_start || start >= old_end) {
....
} else {
if (bytes == 0 && *m) {
....
return 0; // <= 3
}
if (bytes == 0) {
....
return -EAGAIN; // <= 4
}
....
}
return 0; // <= 5
}
int qcow2_alloc_cluster_offset(BlockDriverState *bs, ....)
{
....
ret = handle_dependencies(bs, start, &cur_bytes, m);
if (ret == -EAGAIN) { // <= 2
....
} else if (ret < 0) { // <= 1
....
}
}
ããã§ãã¢ãã©ã€ã¶ãŒã¯ãæ¡ä»¶ïŒã³ã¡ã³ã1ïŒã決ããŠæºããããªãããšãçºèŠããŸãããretå€æ°ã®å€ã¯ãhandle_dependenciesé¢æ°ãå®è¡ããçµæã§åæåãããŸãããã®é¢æ°ã¯ã0ãŸãã¯-EAGAINã®ã¿ãè¿ããŸãïŒã³ã¡ã³ã3ã4ã5ïŒãããå°ãé«ãã§ãããæåã®æ¡ä»¶ã§ã¯ãretã®å€ã-EAGAINïŒã³ã¡ã³ã2ïŒãšç §åãããããåŒret <0ã®çµæã¯åžžã«falseã«ãªããŸãããããããhandle_dependenciesé¢æ°ã¯ç°ãªãå€ãè¿ãããã«äœ¿çšãããŠããŸããããåŸã§ãããšãã°ãªãã¡ã¯ã¿ãªã³ã°ã®çµæãšããŠãåäœãå€æŽãããŸãããããã§ã¯ããªãã¡ã¯ã¿ãªã³ã°ãå®äºããå¿ èŠããããŸããåæ§ã®ããªã¬ãŒïŒ
- V547åŒã¯åžžã«åœã§ããqcow2.c 1070
- V547åŒ 's-> stateïŒ= MIGRATION_STATUS_COLO'ã¯åžžã«falseã§ããcolo.c 595
- V547åŒ 's-> metadata_entries.presentïŒ0x20'ã¯åžžã«falseã§ããvhdx.c 769
èŠå
N4V557ã¢ã¬ã€ã®ãªãŒããŒã©ã³ãçºçããå¯èœæ§ããããŸãã'dwc2_glbreg_read'é¢æ°ã¯å€ '[0..63]'ãåŠçããŸãã3çªç®ã®åŒæ°ã調ã¹ãŸãããã§ãã¯ã©ã€ã³ïŒ667ã1040.hcd-dwc2.c 667
#define HSOTG_REG(x) (x) // <= 5
....
struct DWC2State {
....
#define DWC2_GLBREG_SIZE 0x70
uint32_t glbreg[DWC2_GLBREG_SIZE / sizeof(uint32_t)]; // <= 1
....
}
....
static uint64_t dwc2_glbreg_read(void *ptr, hwaddr addr, int index,
unsigned size)
{
....
val = s->glbreg[index]; // <= 2
....
}
static uint64_t dwc2_hsotg_read(void *ptr, hwaddr addr, unsigned size)
{
....
switch (addr) {
case HSOTG_REG(0x000) ... HSOTG_REG(0x0fc): // <= 4
val = dwc2_glbreg_read(ptr, addr,
(addr - HSOTG_REG(0x000)) >> 2, size); // <= 3
....
}
....
}
ãã®ã³ãŒãã§ã¯ãé åã®ãªãŒããŒã©ã³ã«æœåšçãªåé¡ããããŸããæ§é ã«DWC2Stateã¯ãã¢ã¬ã€å®çŸ©glbregã28åã®èŠçŽ ïŒã³ã¡ã³ã1ïŒãããªããŸããdwc2_glbreg_readé¢æ°ã§ã¯ãã€ã³ããã¯ã¹ã§é åãåç §ããŸãïŒã³ã¡ã³ã2ïŒãããã§ãåŒïŒaddr --HSOTG_REGïŒ0x000ïŒïŒ>> 2ïŒã³ã¡ã³ã3ïŒãã€ã³ããã¯ã¹ãšããŠdwc2_glbreg_readé¢æ°ã«æž¡ãããããšã«æ³šæããŠãã ããããã®é¢æ°ã¯[0..63]ã®ç¯å²ã®å€ãåãããšãã§ããŸããããã確信ããããã«ãã³ã¡ã³ã4ãš5ã«æ³šæãæã£ãŠãã ããããããããããã§ã¯ã³ã¡ã³ã4ããå€ã®ç¯å²ã調æŽããå¿ èŠããããŸãã ããé¡äŒŒããããªã¬ãŒïŒ
- V557ã¢ã¬ã€ã®ãªãŒããŒã©ã³ãçºçããå¯èœæ§ããããŸãã'dwc2_hreg0_read'é¢æ°ã¯å€ '[0..63]'ãåŠçããŸãã3çªç®ã®åŒæ°ã調ã¹ãŸãããã§ãã¯ã©ã€ã³ïŒ814ã1050.hcd-dwc2.c 814
- V557ã¢ã¬ã€ã®ãªãŒããŒã©ã³ãçºçããå¯èœæ§ããããŸãã'dwc2_hreg1_read'é¢æ°ã¯å€ '[0..191]'ãåŠçããŸãã3çªç®ã®åŒæ°ã調ã¹ãŸãããã§ãã¯ã©ã€ã³ïŒ927ã1053.hcd-dwc2.c 927
- V557ã¢ã¬ã€ã®ãªãŒããŒã©ã³ãçºçããå¯èœæ§ããããŸãã'dwc2_pcgreg_read'é¢æ°ã¯å€ '[0..127]'ãåŠçããŸãã3çªç®ã®åŒæ°ã調ã¹ãŸãããã§ãã¯ã©ã€ã³ïŒ1012ã1060.hcd-dwc2.c 1012
èŠå
N5V575ãstrerror_sãé¢æ°ã¯ã0ãèŠçŽ ãåŠçããŸãã2çªç®ã®åŒæ°ã調ã¹ãŸããã³ãã³ã-win32.c1642
void qmp_guest_set_time(bool has_time, int64_t time_ns,
Error **errp)
{
....
if (GetLastError() != 0) {
strerror_s((LPTSTR) & msg_buffer, 0, errno);
....
}
}
strerror_s é¢æ°ã¯ãã·ã¹ãã ãšã©ãŒã³ãŒãã®ããã¹ãã«ãã説æãè¿ããŸãããã®çœ²åã¯æ¬¡ã®ããã«ãªããŸãã
errno_t strerror_s( char *buf, rsize_t bufsz, errno_t errnum );
æåã®ãã©ã¡ãŒã¿ãŒã¯ããã¹ãã®èª¬æãã³ããŒããããããã¡ãŒãžã®ãã€ã³ã¿ãŒã2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ãããã¡ãŒãµã€ãºã3çªç®ã¯ãšã©ãŒã³ãŒãã§ããã³ãŒãã§ã¯ããããã¡ã®ãµã€ãºãšããŠ0ãæž¡ãããŸãããããã¯æããã«èª€ã£ãå€ã§ããã¡ãªã¿ã«ãäœãã€ããå²ãåœãŠãããäºåã«ç¥ãããšã¯å¯èœã§ããstrerrorlen_sãåŒã³åºãã ãã§ããšã©ãŒã®ããã¹ã説æã®é·ããè¿ãããŸãããã®å€ã¯ãååãªãµã€ãºã®ãããã¡ãŒãå²ãåœãŠãããã«äœ¿çšã§ããŸãã
èŠå
N6V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããblen2pããã€ã³ã¿ãŒã䜿çšãããŸããããã§ãã¯ã©ã€ã³ïŒ103ã106.dsound_template.h 103
static int glue (
....
DWORD *blen1p,
DWORD *blen2p,
int entire,
dsound *s
)
{
....
dolog("DirectSound returned misaligned buffer %ld %ld\n",
*blen1p, *blen2p); // <= 1
glue(.... p2p ? *p2p : NULL, *blen1p,
blen2p ? *blen2p : 0); // <= 2
....
}
ãã®ã³ãŒãã§ã¯ãblen2påŒæ°ã®å€ãæåã«äœ¿çšããïŒã³ã¡ã³ã1ïŒã次ã«nullptrããã§ãã¯ãããŸãïŒã³ã¡ã³ã2ïŒããã®éåžžã«çãããå Žæã¯ãæåã«äœ¿çšããåã«ãã§ãã¯ãæ¿å ¥ããã®ãå¿ããããã§ãïŒã³ã¡ã³ã1ïŒãä¿®æ£ãšããŠããã§ãã¯ãè¿œå ããã ãã§ãã
dolog("DirectSound returned misaligned buffer %ld %ld\n",
*blen1p, blen2p ? *blen2p : 0);
blen1p åŒæ°ã«ã€ããŠã¯ãŸã 質åããããŸãããããããããã¯nullãã€ã³ã¿ãŒã§ããå¯èœæ§ããããããã§ããã§ãã¯ãè¿œå ããå¿ èŠããããŸããããã«ããã€ãã®åæ§ã®ããžãã£ãïŒ
- V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããrefããã€ã³ã¿ãŒã䜿çšãããŸããããã§ãã¯ã©ã€ã³ïŒ2191ã2193.uri.c 2191
- V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããcmdlineããã€ã³ã¿ãŒã䜿çšãããŸããããã§ãã¯ã©ã€ã³ïŒ420ã425.qemu-io.c 420
- V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããdpããã€ã³ã¿ãŒã䜿çšãããŸããããã§ãã¯ã©ã€ã³ïŒ288ã294ãonenand.c 288
- V595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ããomap_lcdããã€ã³ã¿ãŒã䜿çšãããŸããããã§ãã¯ã©ã€ã³ïŒ81ã87ãomap_lcdc.c 81
èŠå
N7V597ã³ã³ãã€ã©ã¯ããop_infoããªããžã§ã¯ãããã©ãã·ã¥ããããã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ããå¯èœæ§ããããŸããRtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸããvirtio-crypto.c 354
static void virtio_crypto_free_request(VirtIOCryptoReq *req)
{
if (req) {
if (req->flags == CRYPTODEV_BACKEND_ALG_SYM) {
....
/* Zeroize and free request data structure */
memset(op_info, 0, sizeof(*op_info) + max_len); // <= 1
g_free(op_info);
}
g_free(req);
}
}
ãã®ã³ãŒããã©ã°ã¡ã³ãã§ã¯ãop_infoãªããžã§ã¯ãã«å¯ŸããŠmemseté¢æ°ãåŒã³åºããïŒã³ã¡ã³ã1ïŒããã®åŸop_infoã¯ããã«åé€ãããŸããã€ãŸãããã®ãªããžã§ã¯ããã¯ãªãŒã³ã¢ããããåŸãä»ã®å Žæã§ã¯å€æŽãããŸãããããã¯ãã³ã³ãã€ã©ãæé©åããã»ã¹äžã«memsetåŒã³åºããåé€ã§ããå ŽåãšãŸã£ããåãã§ãããã®æœåšçãªåäœãæé€ããããã«ãã³ã³ãã€ã©ãŒã決ããŠåé€ããªãç¹å¥ãªé¢æ°ã䜿çšã§ããŸãã ããã©ã€ããŒãããŒã¿ãå®å šã«ã¯ãªã¢ãããã®èšäºãåç §ããŠãã ãããN8V610äžç¹å®ã®åäœã®èŠåãã·ããæŒç®å '>>'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ãã¯è² ã§ãïŒ 'number' = [-32768..2147483647]ïŒã cris.c 2111
static void
print_with_operands (const struct cris_opcode *opcodep,
unsigned int insn,
unsigned char *buffer,
bfd_vma addr,
disassemble_info *info,
const struct cris_opcode *prefix_opcodep,
unsigned int prefix_insn,
unsigned char *prefix_buffer,
bfd_boolean with_reg_prefix)
{
....
int32_t number;
....
if (signedp && number > 127)
number -= 256; // <= 1
....
if (signedp && number > 32767)
number -= 65536; // <= 2
....
unsigned int highbyte = (number >> 24) & 0xff;
....
}
å€æ°çªå·ã¯è² ã«ãªãå¯èœæ§ãããããããããåäœã®å³ã·ããã¯æå®ãããŠããªãåäœã§ããåé¡ã®å€æ°ãè² ã®å€ããšãããšãã§ããããšã確èªããã«ã¯ãã³ã¡ã³ã1ãš2ãèŠãŠãã ãããç°ãªããã©ãããã©ãŒã ã§ã®ã³ãŒãã®åäœã®éããé¿ããããã«ããã®ãããªå Žåã¯é¿ããå¿ èŠããããŸãã
ãã®ä»ã®èŠåïŒ
- V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ãã¯è² ã§ãïŒ 'ïŒhclk_div --1ïŒ' = [-1..15]ïŒãaspeed_smc.c 1041
- V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ã 'ïŒtarget_longïŒ-1'ã¯è² ã§ããexec-vary.c 99
- V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ãã¯è² ã§ãïŒ 'hex2nibïŒwords [3] [i * 2 + 2]ïŒ' = [-1..15]ïŒãqtest.c 561
åãã¿ã€ãã®èŠåãããã€ããããå·ŠåŽã®ãªãã©ã³ããšããŠ-1ã®ã¿ã䜿çšãããŸãã
V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ãã-1ãã¯è² ã§ããhppa.c 2702
int print_insn_hppa (bfd_vma memaddr, disassemble_info *info)
{
....
disp = (-1 << 10) | imm10;
....
}
ä»ã®åæ§ã®èŠåïŒ
- V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ãã-1ãã¯è² ã§ããhppa.c 2718
- V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ãã-0x8000ãã¯è² ã§ããfmopl.c 1022
- V610æªå®çŸ©ã®åäœãã·ããæŒç®å '<<'ã確èªããŠãã ãããå·ŠåŽã®ãªãã©ã³ã 'ïŒintptr_tïŒ-1'ã¯è² ã§ããsve_helper.c 889
N9èŠå
V616 0ã®å€ãæã€å®æ°ããããæŒç®ã§äœ¿çšãããŠããååã®ã¶ã»ãTIMER_NONEãããsys_helper.c 179
#define HELPER(name) ....
enum {
TIMER_NONE = (0 << 30), // <= 1
....
}
void HELPER(mtspr)(CPUOpenRISCState *env, ....)
{
....
if (env->ttmr & TIMER_NONE) { // <= 2
....
}
}
TIMER_NONEãã¯ãã®å€ããŒãã§ããããšãç°¡åã«ç¢ºèªã§ããŸãïŒã³ã¡ã³ã1ïŒãããã«ããã®ãã¯ãã¯ãããåäœã®æäœã§äœ¿çšããããã®çµæã¯åžžã«0ã«ãªããŸãããã®çµæãæ¡ä»¶ã¹ããŒãã¡ã³ãã®æ¬äœifïŒenv-> ttmrïŒTIMER_NONEïŒã¯å®è¡ãããŸããã
èŠå
N10V629'n << 9 'åŒã®æ€æ»ãæ€èšããŠãã ããã32ãããå€ã®ãããã·ãããšããã«ç¶ã64ãããã¿ã€ããžã®æ¡åŒµãqemu-img.c 1839
#define BDRV_SECTOR_BITS 9
static int coroutine_fn convert_co_read(ImgConvertState *s,
int64_t sector_num, int nb_sectors, uint8_t *buf)
{
uint64_t single_read_until = 0;
int n;
....
while (nb_sectors > 0) {
....
uint64_t offset;
....
single_read_until = offset + (n << BDRV_SECTOR_BITS);
....
}
....
}
ãã®ã³ãŒããã©ã°ã¡ã³ãã§ã¯ãã·ããæäœã32ãããã®ç¬Šå·ä»ãã¿ã€ããæã€å€æ°nã«å¯ŸããŠå®è¡ããã次ã«ãã®32ãããã®ç¬Šå·ä»ãçµæã64ãããã®ç¬Šå·ä»ãã¿ã€ãã«å±éããã笊å·ãªãã¿ã€ããšããŠã笊å·ãªã64ãããå€æ°ãªãã»ããã«è¿œå ãããŸããåŒã®å®è¡æã«ãå€æ°nã«éèŠãªæäžäœã®9ãããããããšããŸãã 9ãããã®ã·ããæäœïŒBDRV_SECTOR_BITSïŒãå®è¡ããŠããŸãïŒããããŠããã¯æªå®çŸ©ã®åäœã§ããããã®çµæãæäžäœãããã®ã»ããããããååŸã§ããŸãã笊å·ä»ãã¿ã€ãã®ãã®ãããã笊å·ã®åå ã§ããããšãæãåºããŠãã ãããã€ãŸããçµæãè² ã«ãªãå¯èœæ§ããããŸãã nã¯ç¬Šå·ä»ãå€æ°ã§ãããããå±éæã«ç¬Šå·ãèæ ®ãããŸãã次ã«ãçµæããªãã»ããå€æ°ã«è¿œå ãããŸãããããã®èæ ®äºé ãããåŒãå®è¡ããçµæãæå³ãããã®ãšç°ãªãå Žåãããããšã¯å®¹æã«ç解ã§ããŸããèãããã解決çã®1ã€ã¯ãå€æ°nã®åã64ãããã®ç¬Šå·ãªãåãã€ãŸãuint64_tã«çœ®ãæããããšã§ãã
åæ§ã®ããªã¬ãŒãããã€ããããŸãã
- V629 Consider inspecting the '1 << refcount_order' expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type. qcow2.c 3204
- V629 Consider inspecting the 's->cluster_size << 3' expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type. qcow2-bitmap.c 283
- V629 Consider inspecting the 'i << s->cluster_bits' expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type. qcow2-cluster.c 983
- V629 Consider inspecting the expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type. vhdx.c 1145
- V629 Consider inspecting the 'delta << 2' expression. Bit shifting of the 32-bit value with a subsequent expansion to the 64-bit type. mips.c 4341
èŠå
N11V634ã*ãæäœã®åªå 床ã¯ã<<ãæäœã®åªå 床ãããé«ããªã£ãŠããŸããåŒã§æ¬åŒ§ã䜿çšããå¿ èŠãããå¯èœæ§ããããŸããnand.c 310
static void nand_command(NANDFlashState *s)
{
....
s->addr &= (1ull << s->addrlen * 8) - 1;
....
}
äžå¯©ãªå Žæã§ããããã°ã©ããŒãæåã«äœããããã£ãã®ããã·ãããä¹ç®ãã¯æ確ã§ã¯ãããŸãããããã§ééãããªãå Žåã§ããã³ãŒããããäžåºŠç¢ºèªããŠããã©ã±ãããæ£ããé 眮ããå¿ èŠããããŸããããã¯ãéçºè ãã¢ã«ãŽãªãºã ãæ£ããããšã確èªããããã«ç¢ºèªããå¿ èŠãããå Žæã®1ã€ã«ãããŸãããä»ã®ãã®ãããªå ŽæïŒ
- V634ã*ãæäœã®åªå 床ã¯ã<<ãæäœã®åªå 床ãããé«ããªã£ãŠããŸããåŒã§æ¬åŒ§ã䜿çšããå¿ èŠãããå¯èœæ§ããããŸããexynos4210_mct.c 449
- V634ã*ãæäœã®åªå 床ã¯ã<<ãæäœã®åªå 床ãããé«ããªã£ãŠããŸããåŒã§æ¬åŒ§ã䜿çšããå¿ èŠãããå¯èœæ§ããããŸããexynos4210_mct.c 1235
- V634ã*ãæäœã®åªå 床ã¯ã<<ãæäœã®åªå 床ãããé«ããªã£ãŠããŸããåŒã§æ¬åŒ§ã䜿çšããå¿ èŠãããå¯èœæ§ããããŸããexynos4210_mct.c 1264
èŠå
N12V646ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã調ã¹ãããšãæ€èšããŠãã ããã'else'ããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸããpl181.c 400
static void pl181_write(void *opaque, hwaddr offset,
uint64_t value, unsigned size)
{
....
if (s->cmd & PL181_CMD_ENABLE) {
if (s->cmd & PL181_CMD_INTERRUPT) {
....
} if (s->cmd & PL181_CMD_PENDING) { // <= else if
....
} else {
....
}
....
}
....
}
ãã®ã³ãŒãã§ã¯ããã©ãŒãããã«ãã£ãŠã®äœ¿çšå€æããå Žåãä»ã®ä»£ããã®å Žåã¯ãçŽæ¥èªåèªèº«ã瀺åããŠããŸãããããã圌ãã¯ããã«ä»ãè¿œå ããã®ãå¿ããŠããŸããããã®å Žåãä¿®æ£ãªãã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
} else if (s->cmd & PL181_CMD_PENDING) { // <= else if
ãã ãããã®ã³ãŒãã§ã¯ãã¹ãŠãæ£åžžã§ããå¯èœæ§ããããããã°ã©ã ããã¹ãã®ãã©ãŒããããæ£ãããªããããæ··ä¹±ãæããŸãããã®å Žåãã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
if (s->cmd & PL181_CMD_INTERRUPT) {
....
}
if (s->cmd & PL181_CMD_PENDING) { // <= if
....
} else {
....
}
èŠå
N13V773ãã«ãŒã«ããã€ã³ã¿ã解æŸããã«é¢æ°ãçµäºããŸãããã¡ã¢ãªãªãŒã¯ãçºçããå¯èœæ§ããããŸããblkdebug.c 218
static int add_rule(void *opaque, QemuOpts *opts, Error **errp)
{
....
struct BlkdebugRule *rule;
....
rule = g_malloc0(sizeof(*rule)); // <= 1
....
if (local_error) {
error_propagate(errp, local_error);
return -1; // <= 2
}
....
/* Add the rule */
QLIST_INSERT_HEAD(&s->rules[event], rule, next); // <= 3
....
}
ãã®ã³ãŒãã§ã¯ãã«ãŒã«ãªããžã§ã¯ãïŒã³ã¡ã³ã1ïŒãéžæãããåŸã§äœ¿çšããããã«ãªã¹ãã«è¿œå ãããŸãïŒã³ã¡ã³ã3ïŒãããšã©ãŒãçºçããå Žåãé¢æ°ã¯ä»¥åã«äœæãããã«ãŒã«ãªããžã§ã¯ãïŒã³ã¡ã³ã2ïŒãåé€ããã«æ»ããŸããããã§ã¯ããšã©ãŒãæ£ããåŠçããå¿ èŠããããŸãã以åã«äœæãããªããžã§ã¯ããåé€ããŠãã ãããããããªããšãã¡ã¢ãªãªãŒã¯ãçºçããŸãã
èŠå
N14V781'ix 'ã€ã³ããã¯ã¹ã®å€ã¯ã䜿çšåŸã«ãã§ãã¯ãããŸãããããããããã°ã©ã ããžãã¯ã«èª€ãããããŸãã uri.c 2110
char *uri_resolve_relative(const char *uri, const char *base)
{
....
ix = pos;
if ((ref->path[ix] == '/') && (ix > 0)) {
....
}
ããã§ãã¢ãã©ã€ã¶ãŒã¯æœåšçãªç¯å²å€ã®é åãæ€åºããŸãããæåã«ãã€ã³ããã¯ã¹ixã®ref-> pathé åã®èŠçŽ ãèªã¿åããã次ã«ixãæ£ãããã©ããããã§ãã¯ãããŸãïŒix> 0ïŒãããã§ã®æ£ãã解決çã¯ããããã®ã¢ã¯ã·ã§ã³ãéã«ããããšã§ãã
if ((ix > 0) && (ref->path[ix] == '/')) {
ãã®ãããªå Žæãããã€ããããŸããïŒ
- V781'ix 'ã€ã³ããã¯ã¹ã®å€ã¯ã䜿çšåŸã«ãã§ãã¯ãããŸãããããããããã°ã©ã ããžãã¯ã«èª€ãããããŸããuri.c 2112
- V781ããªãã»ãããã€ã³ããã¯ã¹ã®å€ã¯ã䜿çšåŸã«ãã§ãã¯ãããŸãããããããããã°ã©ã ããžãã¯ã«èª€ãããããŸããkeymaps.c 125
- V781'quality 'å€æ°ã®å€ã¯ã䜿çšåŸã«ãã§ãã¯ãããŸãããããããããã°ã©ã ããžãã¯ã«èª€ãããããŸãããã§ãã¯ã©ã€ã³ïŒ326ã335.vnc-enc-tight.c 326
- V781'i 'ã€ã³ããã¯ã¹ã®å€ã¯ã䜿çšåŸã«ãã§ãã¯ãããŸãããããããããã°ã©ã ããžãã¯ã«èª€ãããããŸããmem_helper.c 1929
èŠå
N15V784ããããã¹ã¯ã®ãµã€ãºã第1ãªãã©ã³ãã®ãµã€ãºãããå°ãããããã«ãããäžäœãããã倱ãããŸããcadence_gem.c 1486
typedef struct CadenceGEMState {
....
uint32_t regs_ro[CADENCE_GEM_MAXREG];
}
....
static void gem_write(void *opaque, hwaddr offset, uint64_t val,
unsigned size)
{
....
val &= ~(s->regs_ro[offset]);
....
}
ãã®ã³ãŒãã¯ãããŸããŸãªã¿ã€ãã®ãªããžã§ã¯ãã«å¯ŸããŠãããåäœã®æäœãå®è¡ããŸããå·ŠåŽã®ãªãã©ã³ãã¯åŒæ°valã§ãããã¯64ãããã®ç¬Šå·ãªãã¿ã€ãã§ãã32ãããã®ç¬Šå·ãªãã¿ã€ããæã€ãªãã»ããã€ã³ããã¯ã¹ã§ã®é åèŠçŽ s-> regs_roã®åä¿¡å€ã¯ãå³ãªãã©ã³ããšããŠäœ¿çšãããŸããå³åŽã®æäœã®çµæïŒãïŒs-> regs_ro [offset]ïŒïŒã¯ã32ãããã®ç¬Šå·ãªãã¿ã€ãã§ããããããåäœã®ä¹ç®ã®åã«ããŒãã®ãã64ãããã¿ã€ãã«æ¡åŒµãããŸããã€ãŸããåŒå šäœãè©äŸ¡ããåŸãvalå€æ°ã®ãã¹ãŠã®äžäœãããããŒãã«ãªããŸãããã®ãããªå Žæã¯åžžã«çãããããã«èŠããŸããããã§ã¯ãéçºè ã«ãã®ã³ãŒããå床æ¹èšããããšããå§ãããããšããã§ããŸãããããé¡äŒŒïŒ
- V784ããããã¹ã¯ã®ãµã€ãºã第1ãªãã©ã³ãã®ãµã€ãºãããå°ãããããã«ãããäžäœãããã倱ãããŸããxlnx-zynq-devcfg.c 199
- V784ããããã¹ã¯ã®ãµã€ãºã第1ãªãã©ã³ãã®ãµã€ãºãããå°ãããããã«ãããäžäœãããã倱ãããŸããsoc_dma.c 214
- V784ããããã¹ã¯ã®ãµã€ãºã第1ãªãã©ã³ãã®ãµã€ãºãããå°ãããããã«ãããäžäœãããã倱ãããŸããfpu_helper.c 418
èŠå
N16V1046æäœãïŒ=ãã§ã®ãboolãã¿ã€ããšãunsignedintãã¿ã€ãã®å®å šã§ãªã䜿çšãhelper.c 10821
static inline uint32_t extract32(uint32_t value, int start, int length);
....
static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
ARMMMUIdx mmu_idx)
{
....
bool epd, hpd;
....
hpd &= extract32(tcr, 6, 1);
}
ãã®ã³ãŒãã§ã¯ããããåäœã®ANDæŒç®ãã§å®è¡ãããHPDã®å¯å€åBOOLãšå®è¡çµæextract32ã®æ©èœåæããã®uint32_tããããŒã«å€æ°ã®ãããå€ã¯0ãŸãã¯1ã®ã¿ã§ãããããextract32é¢æ°ã«ãã£ãŠè¿ãããæäžäœãããããŒãã®å ŽåãåŒã®çµæã¯åžžã«falseã«ãªããŸããäŸãæããŠãããèŠãŠã¿ãŸããããhpdãtrueã§ãé¢æ°ã2ãè¿ããšä»®å®ããŸããã€ãŸãããã€ããªè¡šçŸã§ã¯ãæäœã¯01ïŒ10 = 0ã®ããã«ãªããåŒã®çµæã¯falseã«ãªããŸããã»ãšãã©ã®å Žåãããã°ã©ããŒã¯å€ãtrueã«èšå®ããããšèããŠããŸããé¢æ°ããŒã以å€ã®ãã®ãè¿ããå Žåãã©ããããé¢æ°ã®çµæã次ã®ããã«boolã¿ã€ãã«ãã£ã¹ããããããã«ãã³ãŒããä¿®æ£ããå¿ èŠããããŸãã
hpd = hpd && (bool)extract32(tcr, 6, 1);
çµè«
ã芧ã®ãšãããã¢ãã©ã€ã¶ãŒã¯å€ãã®çãããå ŽæãèŠã€ããŸããããããããçºèŠãããæœåšçãªåé¡ã¯ãŸã æããã«ãããŠããŸããããæãäºæããªãç¬éã«çºç«ããå¯èœæ§ãããããããã®ååšã¯ææ ®ãã¹ãã§ããäžå¯©ãªå Žæããã¹ãŠäºåã«ç¢ºèªããŠä¿®æ£ããæ¹ããç¡éã®ãã°ãä¿®æ£ãããããåªããŠããŸããæããã«ããã®ãããªè€éãªãããžã§ã¯ãã®å Žåãç¹ã«å®æçãªãããžã§ã¯ãã¬ãã¥ãŒãçµç¹ããå Žåãéçåæã¯å ·äœçãªã¡ãªãããããããå¯èœæ§ããããŸãããããžã§ã¯ãã§PVS-Studioãè©ŠããŠã¿ããå Žåã¯ããã®ããŒãžã§ã¢ãã©ã€ã¶ãŒãããŠã³ããŒãããŠç¡æã®è©ŠçšããŒãå ¥æã§ããŸãã
ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯EvgeniyOvsannikovã䜿çšããŠãã ãããPVS-Studioã䜿çšããŠQEMUã確èªããŸãã