while ((opt = getopt(argc, argv, "hn:i:p:m:")) != -1) {
                switch (opt) {
                case 'n':
-                       test_args.nr_vcpus = atoi(optarg);
+                       test_args.nr_vcpus = atoi_paranoid(optarg);
                        if (test_args.nr_vcpus <= 0) {
                                pr_info("Positive value needed for -n\n");
                                goto err;
                        }
                        break;
                case 'i':
-                       test_args.nr_iter = atoi(optarg);
+                       test_args.nr_iter = atoi_paranoid(optarg);
                        if (test_args.nr_iter <= 0) {
                                pr_info("Positive value needed for -i\n");
                                goto err;
                        }
                        break;
                case 'p':
-                       test_args.timer_period_ms = atoi(optarg);
+                       test_args.timer_period_ms = atoi_paranoid(optarg);
                        if (test_args.timer_period_ms <= 0) {
                                pr_info("Positive value needed for -p\n");
                                goto err;
                        }
                        break;
                case 'm':
-                       test_args.migration_freq_ms = atoi(optarg);
+                       test_args.migration_freq_ms = atoi_paranoid(optarg);
                        if (test_args.migration_freq_ms < 0) {
                                pr_info("0 or positive value needed for -m\n");
                                goto err;
 
        while ((opt = getopt(argc, argv, "i:")) != -1) {
                switch (opt) {
                case 'i':
-                       ss_iteration = atoi(optarg);
+                       ss_iteration = atoi_paranoid(optarg);
                        break;
                case 'h':
                default:
 
        while ((opt = getopt(argc, argv, "hn:e:l:")) != -1) {
                switch (opt) {
                case 'n':
-                       nr_irqs = atoi(optarg);
+                       nr_irqs = atoi_paranoid(optarg);
                        if (nr_irqs > 1024 || nr_irqs % 32)
                                help(argv[0]);
                        break;
                case 'e':
-                       eoi_split = (bool)atoi(optarg);
+                       eoi_split = (bool)atoi_paranoid(optarg);
                        default_args = false;
                        break;
                case 'l':
-                       level_sensitive = (bool)atoi(optarg);
+                       level_sensitive = (bool)atoi_paranoid(optarg);
                        default_args = false;
                        break;
                case 'h':
 
                        params.vcpu_memory_bytes = parse_size(optarg);
                        break;
                case 'v':
-                       params.nr_vcpus = atoi(optarg);
+                       params.nr_vcpus = atoi_paranoid(optarg);
                        break;
                case 'o':
                        overlap_memory_access = true;
 
                        p.src_type = parse_backing_src_type(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi(optarg);
+                       nr_vcpus = atoi_paranoid(optarg);
                        TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
                        break;
 
                        run_vcpus_while_disabling_dirty_logging = true;
                        break;
                case 'f':
-                       p.wr_fract = atoi(optarg);
+                       p.wr_fract = atoi_paranoid(optarg);
                        TEST_ASSERT(p.wr_fract >= 1,
                                    "Write fraction cannot be less than one");
                        break;
                        help(argv[0]);
                        break;
                case 'i':
-                       p.iterations = atoi(optarg);
+                       p.iterations = atoi_paranoid(optarg);
                        break;
                case 'm':
                        guest_modes_cmdline(optarg);
                        p.backing_src = parse_backing_src_type(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi(optarg);
+                       nr_vcpus = atoi_paranoid(optarg);
                        TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
                        break;
                case 'x':
-                       p.slots = atoi(optarg);
+                       p.slots = atoi_paranoid(optarg);
                        break;
                default:
                        help(argv[0]);
 
        return (void *)align_up((unsigned long)x, size);
 }
 
+int atoi_paranoid(const char *num_str);
+
 #endif /* SELFTEST_KVM_TEST_UTIL_H */
 
                        p.test_mem_size = parse_size(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi(optarg);
+                       nr_vcpus = atoi_paranoid(optarg);
                        TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d", max_vcpus);
                        break;
 
 
        return val[1];
 }
+
+int atoi_paranoid(const char *num_str)
+{
+       char *end_ptr;
+       long num;
+
+       errno = 0;
+       num = strtol(num_str, &end_ptr, 0);
+       TEST_ASSERT(!errno, "strtol(\"%s\") failed", num_str);
+       TEST_ASSERT(num_str != end_ptr,
+                   "strtol(\"%s\") didn't find a valid integer.", num_str);
+       TEST_ASSERT(*end_ptr == '\0',
+                   "strtol(\"%s\") failed to parse trailing characters \"%s\".",
+                   num_str, end_ptr);
+       TEST_ASSERT(num >= INT_MIN && num <= INT_MAX,
+                   "%ld not in range of [%d, %d]", num, INT_MIN, INT_MAX);
+
+       return num;
+}
 
        while ((opt = getopt(argc, argv, "c:h:m:s:H")) != -1) {
                switch (opt) {
                case 'c':
-                       nr_vcpus = atoi(optarg);
+                       nr_vcpus = atoi_paranoid(optarg);
                        TEST_ASSERT(nr_vcpus > 0, "number of vcpus must be >0");
                        break;
                case 'm':
-                       max_mem = atoi(optarg) * size_1gb;
+                       max_mem = atoi_paranoid(optarg) * size_1gb;
                        TEST_ASSERT(max_mem > 0, "memory size must be >0");
                        break;
                case 's':
-                       slot_size = atoi(optarg) * size_1gb;
+                       slot_size = atoi_paranoid(optarg) * size_1gb;
                        TEST_ASSERT(slot_size > 0, "slot size must be >0");
                        break;
                case 'H':
 
                        guest_modes_cmdline(optarg);
                        break;
                case 'd':
-                       p.memslot_modification_delay = strtoul(optarg, NULL, 0);
+                       p.memslot_modification_delay = atoi_paranoid(optarg);
                        TEST_ASSERT(p.memslot_modification_delay >= 0,
                                    "A negative delay is not supported.");
                        break;
                        guest_percpu_mem_size = parse_size(optarg);
                        break;
                case 'v':
-                       nr_vcpus = atoi(optarg);
+                       nr_vcpus = atoi_paranoid(optarg);
                        TEST_ASSERT(nr_vcpus > 0 && nr_vcpus <= max_vcpus,
                                    "Invalid number of vcpus, must be between 1 and %d",
                                    max_vcpus);
                        p.partition_vcpu_memory_access = false;
                        break;
                case 'i':
-                       p.nr_memslot_modifications = atoi(optarg);
+                       p.nr_memslot_modifications = atoi_paranoid(optarg);
                        break;
                case 'h':
                default:
 
                        map_unmap_verify = true;
                        break;
                case 's':
-                       targs->nslots = atoi(optarg);
+                       targs->nslots = atoi_paranoid(optarg);
                        if (targs->nslots <= 0 && targs->nslots != -1) {
                                pr_info("Slot count cap has to be positive or -1 for no cap\n");
                                return false;
                        }
                        break;
                case 'f':
-                       targs->tfirst = atoi(optarg);
+                       targs->tfirst = atoi_paranoid(optarg);
                        if (targs->tfirst < 0) {
                                pr_info("First test to run has to be non-negative\n");
                                return false;
                        }
                        break;
                case 'e':
-                       targs->tlast = atoi(optarg);
+                       targs->tlast = atoi_paranoid(optarg);
                        if (targs->tlast < 0 || targs->tlast >= NTESTS) {
                                pr_info("Last test to run has to be non-negative and less than %zu\n",
                                        NTESTS);
                        }
                        break;
                case 'l':
-                       targs->seconds = atoi(optarg);
+                       targs->seconds = atoi_paranoid(optarg);
                        if (targs->seconds < 0) {
                                pr_info("Test length in seconds has to be non-negative\n");
                                return false;
                        }
                        break;
                case 'r':
-                       targs->runs = atoi(optarg);
+                       targs->runs = atoi_paranoid(optarg);
                        if (targs->runs <= 0) {
                                pr_info("Runs per test has to be positive\n");
                                return false;
 
 
 #ifdef __x86_64__
        if (argc > 1)
-               loops = atoi(argv[1]);
+               loops = atoi_paranoid(argv[1]);
        else
                loops = 10;
 
 
        while ((opt = getopt(argc, argv, "hp:t:r")) != -1) {
                switch (opt) {
                case 'p':
-                       reclaim_period_ms = atoi(optarg);
+                       reclaim_period_ms = atoi_paranoid(optarg);
                        break;
                case 't':
-                       token = atoi(optarg);
+                       token = atoi_paranoid(optarg);
                        break;
                case 'r':
                        reboot_permissions = true;