/* RAM waster */ /* this program is given into the public domain by its author, Robert Clausecker. 2016-09-10. */ #include #include #include #include #include #include static size_t compute_amount(const char*); extern int main(int argc, char *argv[]) { size_t amount; char *memory; if (argc != 2) { fprintf(stderr, "Usage: %s amount-to-waste\n", argv[0]); fprintf(stderr, "suffixes kmgtpe are supported.\n"); fprintf(stderr, "lower case suffixes are binary, upper case decimal\n"); return (EXIT_FAILURE); } amount = compute_amount(argv[1]); memory = malloc(amount); if (memory == NULL) { fprintf(stderr, "%s is too much memory!\n", argv[1]); return (EXIT_FAILURE); } /* make sure pages are actually mapped */ memset(memory, 0x55, amount); printf("Wasting %llu bytes of memory at %p...\n", (unsigned long long)amount, (void*)memory); printf("Press enter to stop wasting memory"); fflush(stdout); getchar(); free(memory); return (EXIT_SUCCESS); } static size_t compute_amount(const char *numstr) { unsigned long long size; static unsigned long long sizes[] = { 1000ULL, /* K */ 1000000ULL, /* M */ 1000000000ULL, /* G */ 1000000000000ULL, /* T */ 1000000000000000ULL, /* P */ 1000000000000000000ULL, /* E */ 1ULL << 10, /* k */ 1ULL << 20, /* m */ 1ULL << 30, /* g */ 1ULL << 40, /* t */ 1ULL << 50, /* p */ 1ULL << 60, /* e */ 1ULL, /* no suffix, i.e. \0 */ }; const char *sizestr = "KMGTPEkmgtpe", *endptr, *suffix; if (!isdigit(numstr[0])) { fprintf(stderr, "%s is not a number!\n", numstr); exit(EXIT_FAILURE); } errno = 0; size = strtoull(numstr, (char**)&endptr, 10); if (endptr[0] != '\0' && endptr[1] != '\0') { fprintf(stderr, "unrecognized suffix %s\n", endptr); exit(EXIT_FAILURE); } if (errno == ERANGE) { fprintf(stderr, "%s is too much memory!\n", numstr); exit(EXIT_FAILURE); } /* attempt to parse suffix */ suffix = strchr(sizestr, endptr[0]); if (suffix == NULL) { fprintf(stderr, "unrecognized suffix %s\n", endptr); exit(EXIT_FAILURE); } /* check for overflow */ if (size > ULLONG_MAX / sizes[suffix - sizestr] || size * sizes[suffix - sizestr] > (size_t)-1) { fprintf(stderr, "%s is too much memory!\n", numstr); exit(EXIT_FAILURE); } return (size * sizes[suffix - sizestr]); }