17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only 23f984cb3SAndrzej Hajda/// Unsigned expressions cannot be lesser than zero. Presence of 33f984cb3SAndrzej Hajda/// comparisons 'unsigned (<|<=|>|>=) 0' often indicates a bug, 43f984cb3SAndrzej Hajda/// usually wrong type of variable. 53f984cb3SAndrzej Hajda/// 63f984cb3SAndrzej Hajda/// To reduce number of false positives following tests have been added: 73f984cb3SAndrzej Hajda/// - parts of range checks are skipped, eg. "if (u < 0 || u > 15) ...", 83f984cb3SAndrzej Hajda/// developers prefer to keep such code, 93f984cb3SAndrzej Hajda/// - comparisons "<= 0" and "> 0" are performed only on results of 103f984cb3SAndrzej Hajda/// signed functions/macros, 113f984cb3SAndrzej Hajda/// - hardcoded list of signed functions/macros with always non-negative 123f984cb3SAndrzej Hajda/// result is used to avoid false positives difficult to detect by other ways 133f984cb3SAndrzej Hajda/// 143f984cb3SAndrzej Hajda// Confidence: Average 157f904d7eSThomas Gleixner// Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd. 16*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website 173f984cb3SAndrzej Hajda// Options: --all-includes 183f984cb3SAndrzej Hajda 193f984cb3SAndrzej Hajdavirtual context 203f984cb3SAndrzej Hajdavirtual org 213f984cb3SAndrzej Hajdavirtual report 223f984cb3SAndrzej Hajda 233f984cb3SAndrzej Hajda@r_cmp@ 243f984cb3SAndrzej Hajdaposition p; 253f984cb3SAndrzej Hajdatypedef bool, u8, u16, u32, u64; 263f984cb3SAndrzej Hajda{unsigned char, unsigned short, unsigned int, unsigned long, unsigned long long, 273f984cb3SAndrzej Hajda size_t, bool, u8, u16, u32, u64} v; 283f984cb3SAndrzej Hajdaexpression e; 293f984cb3SAndrzej Hajda@@ 303f984cb3SAndrzej Hajda 313f984cb3SAndrzej Hajda \( v = e \| &v \) 323f984cb3SAndrzej Hajda ... 333f984cb3SAndrzej Hajda (\( v@p < 0 \| v@p <= 0 \| v@p >= 0 \| v@p > 0 \)) 343f984cb3SAndrzej Hajda 353f984cb3SAndrzej Hajda@r@ 363f984cb3SAndrzej Hajdaposition r_cmp.p; 373f984cb3SAndrzej Hajdatypedef s8, s16, s32, s64; 383f984cb3SAndrzej Hajda{char, short, int, long, long long, ssize_t, s8, s16, s32, s64} vs; 393f984cb3SAndrzej Hajdaexpression c, e, v; 403f984cb3SAndrzej Hajdaidentifier f !~ "^(ata_id_queue_depth|btrfs_copy_from_user|dma_map_sg|dma_map_sg_attrs|fls|fls64|gameport_time|get_write_extents|nla_len|ntoh24|of_flat_dt_match|of_get_child_count|uart_circ_chars_pending|[A-Z0-9_]+)$"; 413f984cb3SAndrzej Hajda@@ 423f984cb3SAndrzej Hajda 433f984cb3SAndrzej Hajda( 443f984cb3SAndrzej Hajda v = f(...)@vs; 453f984cb3SAndrzej Hajda ... when != v = e; 463f984cb3SAndrzej Hajda* (\( v@p <=@e 0 \| v@p >@e 0 \)) 473f984cb3SAndrzej Hajda ... when any 483f984cb3SAndrzej Hajda| 493f984cb3SAndrzej Hajda( 503f984cb3SAndrzej Hajda (\( v@p < 0 \| v@p <= 0 \)) || ... || (\( v >= c \| v > c \)) 513f984cb3SAndrzej Hajda| 523f984cb3SAndrzej Hajda (\( v >= c \| v > c \)) || ... || (\( v@p < 0 \| v@p <= 0 \)) 533f984cb3SAndrzej Hajda| 543f984cb3SAndrzej Hajda (\( v@p >= 0 \| v@p > 0 \)) && ... && (\( v < c \| v <= c \)) 553f984cb3SAndrzej Hajda| 563f984cb3SAndrzej Hajda ((\( v < c \| v <= c \) && ... && \( v@p >= 0 \| v@p > 0 \))) 573f984cb3SAndrzej Hajda| 583f984cb3SAndrzej Hajda* (\( v@p <@e 0 \| v@p >=@e 0 \)) 593f984cb3SAndrzej Hajda) 603f984cb3SAndrzej Hajda) 613f984cb3SAndrzej Hajda 623f984cb3SAndrzej Hajda@script:python depends on org@ 633f984cb3SAndrzej Hajdap << r_cmp.p; 643f984cb3SAndrzej Hajdae << r.e; 653f984cb3SAndrzej Hajda@@ 663f984cb3SAndrzej Hajda 673f984cb3SAndrzej Hajdamsg = "WARNING: Unsigned expression compared with zero: %s" % (e) 683f984cb3SAndrzej Hajdacoccilib.org.print_todo(p[0], msg) 693f984cb3SAndrzej Hajda 703f984cb3SAndrzej Hajda@script:python depends on report@ 713f984cb3SAndrzej Hajdap << r_cmp.p; 723f984cb3SAndrzej Hajdae << r.e; 733f984cb3SAndrzej Hajda@@ 743f984cb3SAndrzej Hajda 753f984cb3SAndrzej Hajdamsg = "WARNING: Unsigned expression compared with zero: %s" % (e) 763f984cb3SAndrzej Hajdacoccilib.report.print_report(p[0], msg) 77