2012-01-16 3 views
0

Исходный код square.c является:Как заставить программу C распечатать неожиданный результат?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int square(int *ptr) 
{ 
    int a; 
    a = *ptr; 
    return a * a; 
} 

int main(int argc, char **argv) 
{ 
    int a, aa; 
    srandom(time(NULL)); 
    a = random() % 10 + 1; 
    aa = square(&a); 
    printf("%d\n", aa); 
    return 0; 
} 

Командная строка скомпилировать исходный код:

gcc square.c -o square 

Можно ли запустить square исполняемый файл в Linux, так что напечатанный значение будет не - квадрат любого целого числа?

Любые Способ запуска программы разрешен.

+0

домашнее задание? собеседование? пожалуйста, отметьте его соответствующим образом. – amit

+3

'./square | echo 10' – interjay

+0

Почему вы пытаетесь написать правильную программу, а затем попытаетесь получить от нее неожиданный результат? –

ответ

0

Единственная зависимость от вашего кода - libc. Если libc остается неизменным, ваш код всегда будет работать.

Также ваша программа потерпит неудачу, если перед ее запуском исчерпана вся доступная память. Вы всегда можете проверить, является ли ptr! = NULL.

+1

Я не вижу, как random() возвращает 0, чтобы сделать квадрат() неудачным. –

+0

Квадрат 0 равен 0. Однако бег ./a.out всегда будет печатать 0, после этого у нас нет программы, которая печатает квадрат _random_. Выход будет _constant_ – cateof

+2

Код 'a = random()% 10 + 1', поэтому a будет 1, а выход будет равен 1. Кроме того, исходный вопрос заключался в том, что программа может в любом запуске печатать значение это не квадрат целочисленного числа. 0 и 1 - квадрат целочисленного числа. (Конечно, вы правы, что программа может не делать то, что она предназначена). –

0

Вы могли бы использовать это:

Fastest way to determine if an integer's square root is an integer

Их код кажется оптимизирован, но в зависимости от того Простейшим должен сделать трюк для вас.

+0

То же самое, кроме того. OP не хочет узнать, является ли число квадратом. –

6

Да. Мы можем переопределить printf.

Написать код в ваш пост в square.c и скомпилировать его с gcc square.c

Сделайте этот файл, fakesquare.c

int printf(char *str,int i) 
{ 
    return puts("7"); 
} 

Compile fakesquare.c как разделяемые библиотеки:

gcc -fPIC -o libfakesquare.so -shared fakesquare.c 

Выполнение квадратной программы с помощью libfakesquare.so preloaded:

 
[15:27:27 0 /tmp] $ LD_PRELOAD=./libfakesqare.so ./a.out 
7 
[15:29:16 0 /tmp] $ LD_PRELOAD=./libfakesqare.so ./a.out 
7 
[15:29:16 0 /tmp] $ LD_PRELOAD=./libfakesqare.so ./a.out 
7 

Witout libfakeshared.so предустановленными:

 
[15:29:40 0 /tmp] $ ./a.out 
36 
[15:29:41 0 /tmp] $ ./a.out 
16 
[15:29:42 0 /tmp] $ ./a.out 
64 
0

Предполагая стандартную среду C Я не вижу причин, почему это должно потерпеть неудачу на стандартной платформе. Код может выйти из строя, если printf не выполняет то, что он намерен делать, но я, вероятно, это не то, о чем вы просите. Он также может выйти из строя на платформе, где int меньше байта, а байт имеет ширину всего 6 бит. В этом случае ваша квадратная функция может вычислить 9 * 9 = 81, которая не будет соответствовать типу результата int (0..63 для 6 бит-байтов). Но, на мой взгляд, это довольно академический случай.

Смежные вопросы