Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 28.11.2017
Сообщений: 55

Попытка неявного изменения переменной

09.01.2020, 19:07. Показов 850. Ответов 13

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int a = 1;
int b = 8; // адрес переменной b = адрес переменной a - 4
 
unsigned int a_address = reinterpret_cast<std::uintptr_t>(&a);
 
void main()
{
    printf("b = %d\n \n", b);
    
    int *p = (int*)(a_address-4);
    
    printf("b address %d\n", &b);
    printf("p address %d\n \n", p);
    
    *p = 35;
    printf("b = %d\n", b);
    printf("b = %d\n", b);
}
Результат:

Code
1
2
3
4
5
6
7
b = 8
 
b address 673200
p address 673200
 
b = 8 // почему не 35
b = 35 // почему только сейчас 35
Но если закомментировать // printf("b address %d\n", &b); где упоминается адрес переменной b (&b) :

Code
1
2
3
4
5
6
b = 8
 
p address 8930732
 
b = 8
b = 8
Что с логикой?
Выходит можно "неявно изменить переменную" со второй попытки, если адрес переменной упоминается выше? =)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.01.2020, 19:07
Ответы с готовыми решениями:

Доступны ли побитовые операции с unsigned char типом (одно-байтовой переменной) без неявного приведения к INT
Отказавшись от bitset мне удалось ускорить работу программы примерно в 2,25 раза Вот её код (ребят cyberforum.ru - не сохраняет оригинал...

System.AccessViolationException: Попытка чтения или записи в защищенную память - попытка 2
В предыдущей теме некто вообразил, что код зацикливается, поэтому приходится выкладывать более широкую модель. Надеюсь, до целого проекта...

System.AccessViolationException: Попытка чтения или записи в защищенную память - попытка 3
Уже простите за некомпилируемый код, просто я переустановил Windows, и Visual Studio удалилась, только сегодня днем установил. Код там...

13
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
09.01.2020, 20:07
Цитата Сообщение от stas39 Посмотреть сообщение
Что с логикой?
С логикой всё в порядке)))
С программой у вас не всё в порядке.

Неопределенное поведение (undefined behavior)– поведение, которое может возникать в результате использования ошибочных программных конструкций или некорректных данных, на которые Международный Стандарт не налагает никаких требований. Неопределенное поведение также может возникать в ситуациях, не описанных в Стандарте явно.
1
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,984
09.01.2020, 21:07
Цитата Сообщение от stas39 Посмотреть сообщение
int a = 1;
int b = 8; // адрес переменной b = адрес переменной a - 4
- это не гарантируется. Мало того, что размер int может быть не 4 байта, так и расположены эти переменные компилятором могут быть в регистрах
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.01.2020, 21:11
Цитата Сообщение от stas39 Посмотреть сообщение
b = 8 // почему не 35
C++
1
std::uintptr_t a_address = reinterpret_cast<std::uintptr_t>(&a);
C++
1
int *p = (int*)(a_address + sizeof(int));
Добавлено через 3 минуты
В debug работает, а в Release - нет. Плохая идея так делать
0
0 / 0 / 0
Регистрация: 28.11.2017
Сообщений: 55
09.01.2020, 21:48  [ТС]
Это работает хорошо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int a = 1;
int b = 8;
 
int a_address = reinterpret_cast<std::uintptr_t>(&a);
 
void main()
{
    if (&b)
    {
        *(int*)(a_address - sizeof(int)) = 35;
        printf("b = %d\n", b); // b = 35
    }
}
Доступ к адресу получаем как только упоминаем оригинальную переменную, точнее её адрес.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Мало того, что размер int может быть не 4 байта
Подправил на sizeof(int) (спс oleg-m1973)

Цитата Сообщение от Алексей1153 Посмотреть сообщение
расположены эти переменные компилятором могут быть в регистрах
Наверно. Но раз я скомпилировал, проверил, и увидел что работает, значит это хорошая новость верно?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
В debug работает, а в Release - нет. Плохая идея так делать
У меня работает и в release. Подробнее, почему это плохая идея.
Я не против услышать и другие идеи о неявном чтении/изменении переменных =)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.01.2020, 21:51
Цитата Сообщение от stas39 Посмотреть сообщение
У меня работает и в release. Подробнее, почему это плохая идея.
Потому что компилятор может запросто заоптимизировать переменную b. Увидит, что ты её не изменяешь и подставит вместо неё константу
0
0 / 0 / 0
Регистрация: 28.11.2017
Сообщений: 55
09.01.2020, 21:54  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Потому что компилятор может запросто заоптимизировать переменную b. Увидит, что ты её не изменяешь и подставит вместо неё константу
Ответ тот же, что и выше.
Если это произойдет, то я точно узнаю об этом при тесте программы.
А раз ошибки нет, значит всё хорошо, потому что взломщику будет сложнее.
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,984
09.01.2020, 21:57
Цитата Сообщение от stas39 Посмотреть сообщение
увидел что работает, значит это хорошая новость верно?
это плохая новость. Код случайно заработал "правильно", чем ввёл тебя в заблуждение. А вообще, так делать нельзя, если не хочется непонятных багов

Цитата Сообщение от stas39 Посмотреть сообщение
взломщику будет сложнее
До взломщика дело не дойдёт
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.01.2020, 21:58
Цитата Сообщение от stas39 Посмотреть сообщение
Ответ тот же, что и выше.
Если это произойдет, то я точно узнаю об этом при тесте программы.
Точно об этом узнать ты можешь только посмотрев ассемблерный код, который генерится из твоей программы
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,984
09.01.2020, 22:00
stas39, единственный способ хоть как-то защитить программу от взлома - хранить часть функционала в недосягаемости для юзеров. Например, веб-сервер. Или железяка в USB с защитой памяти МК от чтения.

Можно ещё попробовать надавить на совесть, чтобы юзер добровольно перевёл денежку на счёт Ну а вдруг
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
09.01.2020, 22:01
Цитата Сообщение от stas39 Посмотреть сообщение
А раз ошибки нет, значит всё хорошо, потому что взломщику будет сложнее.
Да конечно.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
 
// Euclidian algorithm for calculating greatest common divisor (before obfuscation)
int gcd( int n, int m )
{
    if( n < 1 || m < 1 ) return -1;
    while( n != m )
    {
        if( n > m ) n -= m;
        else m -= n;
    }
    return n;
}
 
// Tests in triplets { n, m, expected_gcd( n, m ) }
int tests[][ 3 ] = {
    { 1, 2, 1 },
    { 3, 3, 3 },
    { 42, 56, 14 },
    { 249084, 261183, 111 },
};
 
// Perform tests
int main( int, char*[] )
{
    printf( "Performing tests of gcd function:\n" );
    bool passed = true;
    for( int i = 0; i < sizeof( tests ) / sizeof( tests[ 0 ] ); i++ )
    {
        int n = tests[ i ][ 0 ];
        int m = tests[ i ][ 1 ];
        int expected_gcd = tests[ i ][ 2 ];
        int calculated_gcd = gcd( n, m );
        printf( "  %d. gcd( %d, %d ) = %d, ", i + 1, n, m, calculated_gcd );
        if( calculated_gcd == expected_gcd )
        {
            printf( "OK.\n" );
        }
        else
        {
            printf( "error.\n" );
            passed = false;
        }
    }
    printf( "Tests %s.\n", passed ? "passed" : "failed" );
    return passed ? 0 : 1;
}
-->
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
#include <stdio.h>
 
// Euclidian algorithm for calculating greatest common divisor (after obfuscation)
int gcd( int n_0, int m_1 )
{
    bool temp_12;
    unsigned int temp_13;
    unsigned int temp_14;
    unsigned int temp_15;
    unsigned int temp_17;
    int temp_26;
    int temp_35;
    bool temp_36;
    unsigned int temp_37;
    bool temp_38;
    int temp_39;
    int temp_40;
    int temp_41;
    int temp_42;
    bool state0_43;
    bool state1_44;
    bool state2_45;
    bool state3_46;
    bool state4_47;
    bool state5_48;
    bool state6_49;
    bool state7_50;
 
    L1:
    L0:
    state0_43 = (bool)1;
    state1_44 = (bool)state0_43;
    state2_45 = (bool)state1_44;
    state3_46 = (bool)state2_45;
    goto L126;
 
    L6:
    temp_37 = ( unsigned int )(temp_17);
    temp_38 = ( bool )( temp_36 == 0 );
    if (state0_43) goto L158; else goto L40;
 
    L14:
    temp_41 = ( int )(temp_17);
    temp_38 = ( bool )( temp_36 == 0 );
    if (state0_43) goto L160; else goto L128;
 
    L22:
    temp_26 = ( int )(temp_41);
    if (state4_47) goto L70; else goto L72;
 
    L24:
    temp_41 = (int)state6_49;
    temp_42 = temp_41 - temp_40;
    temp_26 = (int)temp_42;
    temp_35 = temp_39 + temp_42;
    temp_39 = (int)temp_35;
    if (state1_44) goto L30; else goto L26;
 
    L26:
    temp_42 = ( int )( state0_43 == 0 );
    temp_26 = temp_42 - temp_39;
    temp_41 = (int)temp_26;
    temp_35 = temp_40 + temp_26;
    temp_40 = (int)temp_35;
    goto L30;
 
    L30:
    temp_36 = temp_39 != temp_40;
    if (temp_36) goto L22; else goto L82;
 
    L38:
    state1_44 = ( bool )( state5_48 == 0 );
    temp_26 = temp_39 + temp_35;
    temp_42 = ( int )( state5_48 == 0 );
    temp_42 = temp_42 - temp_35;
    temp_40 = temp_26 + temp_42;
    temp_41 = (int)1495809726u;
    // The next string is really just an assignment on 32bit platform
    temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) );
    goto L44;
 
    L40:
    goto L128;
 
    L42:
    if (state3_46) goto L82; else goto L84;
 
    L44:
    temp_35 = temp_40 ^ temp_41;
    temp_42 = (int)1495809726u;
    if (state1_44) goto L6; else goto L100;
 
    L46:
    temp_41 = ( int )( state4_47 == 0 );
    if (state3_46) goto L22; else goto L98;
 
    L48:
    // The next string is really just an assignment on 32bit platform
    temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) );
    if (state7_50) goto L66; else goto L96;
 
    L52:
    temp_35 = temp_41 + temp_42;
    if (state2_45) goto L76; else goto L94;
 
    L54:
    // The next string is really just an assignment on 32bit platform
    temp_26 = ( int )( ( size_t )( temp_26 ) + ( ( ( size_t )( temp_26 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_26 ) << 31 ) << 1 ) >> 15 ) );
    if (state2_45) goto L14; else goto L102;
 
    L56:
    temp_36 = temp_39 <= temp_41;
    temp_26 = ( int )(temp_17);
    if (state5_48) goto L80; else goto L92;
 
    L58:
    temp_37 = (unsigned int)state6_49;
    temp_42 = ( int )(temp_38);
    if (state2_45) goto L48; else goto L90;
 
    L60:
    state2_45 = ( bool )( state6_49 == 0 );
    temp_38 = (bool)0u;
    if (temp_36) goto L74; else goto L146;
 
    L62:
    temp_35 = (int)0;
    if (state3_46) goto L26; else goto L104;
 
    L64:
    temp_41 = ( int )(temp_17);
    state3_46 = ( bool )( state6_49 == 0 );
    state4_47 = ( bool )( state6_49 == 0 );
    temp_35 = (int)state6_49;
    temp_36 = temp_40 <= temp_35;
    if (state0_43) goto L162; else goto L154;
 
    L66:
    state7_50 = (bool)state6_49;
    state5_48 = (bool)state2_45;
    temp_39 = (int)-1;
    temp_40 = (int)1495809726u;
    if (state6_49) goto L22; else goto L42;
 
    L68:
    temp_39 = (int)-1;
    if (state7_50) goto L88; else goto L86;
 
    L70:
    temp_36 = temp_39 > temp_40;
    temp_17 = ( unsigned int )(temp_36);
    if (temp_36) goto L24; else goto L62;
 
    L72:
    temp_42 = temp_35 | temp_26;
    temp_41 = temp_35 & temp_26;
    temp_17 = ( unsigned int )(temp_42);
    temp_37 = ( unsigned int )(temp_41);
    temp_38 = temp_17 < temp_37;
    if (temp_38) goto L154; else goto L148;
 
    L74:
    temp_35 = temp_39 - temp_40;
    if (state3_46) goto L106; else goto L14;
 
    L76:
    temp_41 = ( int )( state0_43 == 0 );
    temp_26 = temp_41 - temp_39;
    temp_35 = temp_40 + temp_26;
    temp_40 = (int)temp_35;
    temp_36 = temp_39 != temp_40;
    if (state2_45) goto L154; else goto L40;
 
    L80:
    temp_42 = temp_39 + temp_35;
    temp_26 = (int)temp_42;
    temp_40 = temp_42 - temp_35;
    temp_13 = ( unsigned int )(state7_50);
    temp_14 = (unsigned int)131u;
    temp_13 = temp_13 * temp_14;
    temp_14 = (unsigned int)1495809857u;
    temp_13 = temp_14 - temp_13;
    temp_41 = ( int )( ( ptrdiff_t )( ( temp_13 ) & 0xFFFFFFFF ) );
    // The next string is really just an assignment on 32bit platform
    temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) );
    if (state3_46) goto L164; else goto L152;
 
    L82:
    temp_17 = ( unsigned int )(temp_42);
    // The next string is really just an assignment on 32bit platform
    temp_40 = ( int )( ( size_t )( temp_40 ) + ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) >> 15 ) );
    temp_35 = temp_39 ^ temp_40;
    if (state7_50) goto L38; else goto L108;
 
    L84:
    // The next string is really just an assignment on 32bit platform
    temp_40 = ( int )( ( size_t )( temp_40 ) + ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_40 ) << 31 ) << 1 ) >> 15 ) );
    temp_35 = temp_39 ^ temp_40;
    temp_41 = (int)1495809726u;
    if (state5_48) goto L68; else goto L64;
 
    L86:
    // The next string is really just an assignment on 32bit platform
    temp_41 = ( int )( ( size_t )( temp_41 ) + ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_41 ) << 31 ) << 1 ) >> 15 ) );
    temp_17 = ( unsigned int )(temp_42);
    if (state7_50) goto L68; else goto L110;
 
    L88:
    state7_50 = ( bool )( state0_43 == 0 );
    temp_40 = (int)1495809726u;
    state5_48 = ( bool )( state6_49 == 0 );
    goto L42;
 
    L90:
    temp_38 = (bool)state2_45;
    temp_17 = ( unsigned int )(temp_37);
    goto L150;
 
    L92:
    state2_45 = (bool)state5_48;
    temp_37 = (unsigned int)0u;
    temp_17 = (unsigned int)0u;
    state4_47 = ( bool )( state7_50 == 0 );
    temp_26 = ( int )(temp_39);
    goto L58;
 
    L94:
    temp_26 = (int)836078487u;
    goto L156;
 
    L96:
    temp_39 = temp_35 ^ temp_41;
    temp_17 = ( unsigned int )(temp_36);
    return temp_39;
 
    L98:
    state2_45 = (bool)state6_49;
    temp_42 = (int)836078487u;
    // The next string is really just an assignment on 32bit platform
    temp_42 = ( int )( ( size_t )( temp_42 ) + ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) >> 15 ) );
    goto L52;
 
    L100:
    temp_36 = ( bool )(temp_39);
    // The next string is really just an assignment on 32bit platform
    temp_42 = ( int )( ( size_t )( temp_42 ) + ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) + ( ( ( ( size_t )( temp_42 ) << 31 ) << 1 ) >> 15 ) );
    state6_49 = (bool)state2_45;
    temp_39 = temp_35 ^ temp_42;
    return temp_39;
 
    L102:
    temp_41 = temp_35 - temp_26;
    state2_45 = ( bool )( state3_46 == 0 );
    state5_48 = ( bool )( state7_50 == 0 );
    goto L56;
 
    L104:
    temp_42 = ( int )(temp_17);
    state3_46 = (bool)state2_45;
    temp_36 = temp_40 <= temp_35;
    state4_47 = (bool)state0_43;
    state5_48 = ( bool )( state6_49 == 0 );
    if (temp_36) goto L54; else goto L30;
 
    L106:
    temp_17 = ( unsigned int )(temp_40);
    temp_41 = temp_35 + temp_26;
    goto L152;
 
    L108:
    temp_41 = (int)1495809726u;
    goto L148;
 
    L110:
    temp_39 = temp_35 ^ temp_41;
    return temp_39;
 
    L122:
    temp_39 = temp_41 - temp_26;
    goto L30;
 
    L126:
    state4_47 = (bool)state3_46;
    state5_48 = (bool)state4_47;
    state6_49 = ( bool )( state5_48 == 0 );
    state7_50 = ( bool )( state6_49 == 0 );
    goto L40;
 
    L128:
    state3_46 = ( bool )( state7_50 == 0 );
    temp_40 = (int)m_1;
    temp_39 = (int)n_0;
    goto L46;
 
    L144:
    temp_36 = temp_39 > temp_40;
    if (temp_36) goto L146; else goto L52;
 
    L146:
    temp_36 = ( bool )(temp_37);
    temp_42 = ( int )(temp_17);
    temp_41 = ( int )(temp_39);
    temp_17 = ( unsigned int )(temp_40);
    if (state3_46) goto L74; else goto L44;
 
    L148:
    if (state7_50) goto L144; else goto L58;
 
    L150:
    if (state2_45) goto L44; else goto L60;
 
    L152:
    temp_38 = ( bool )(temp_17);
    temp_37 = ( unsigned int )(temp_41);
    temp_36 = ( bool )(temp_38);
    if (state4_47) goto L122; else goto L62;
 
    L154:
    temp_17 = ( unsigned int )(temp_36);
    if (temp_36) goto L156; else goto L56;
 
    L156:
    if (state2_45) goto L46; else goto L54;
 
    L158:
    if (temp_38) goto L152; else goto L64;
 
    L160:
    if (temp_38) goto L48; else goto L86;
 
    L162:
    state5_48 = ( bool )( state6_49 == 0 );
    if (temp_36) goto L14; else goto L30;
 
    L164:
    state1_44 = ( bool )( state3_46 == 0 );
    goto L150;
 
}
 
// Tests in triplets { n, m, expected_gcd( n, m ) }
int tests[][ 3 ] = {
    { 1, 2, 1 },
    { 3, 3, 3 },
    { 42, 56, 14 },
    { 249084, 261183, 111 },
};
 
// Perform tests
int main( int, char*[] )
{
    printf( "Performing tests of gcd function:\n" );
    bool passed = true;
    for( int i = 0; i < sizeof( tests ) / sizeof( tests[ 0 ] ); i++ )
    {
        int n = tests[ i ][ 0 ];
        int m = tests[ i ][ 1 ];
        int expected_gcd = tests[ i ][ 2 ];
        int calculated_gcd = gcd( n, m );
        printf( "  %d. gcd( %d, %d ) = %d, ", i + 1, n, m, calculated_gcd );
        if( calculated_gcd == expected_gcd )
        {
            printf( "OK.\n" );
        }
        else
        {
            printf( "error.\n" );
            passed = false;
        }
    }
    printf( "Tests %s.\n", passed ? "passed" : "failed" );
    return passed ? 0 : 1;
}
Вот это обфускация. )))
Пример взят со страницы StarForce C++ Obfuscator
2
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
10.01.2020, 01:54
Цитата Сообщение от Croessmah Посмотреть сообщение
Вот это обфускация. )))
Цитата Сообщение от https://wandbox.org/permlink/eYrhvOjW1ePhJrZD
Code
1
2
3
prog.cc:183:26: error: use of undeclared identifier 'ptrdiff_t'
    temp_41 = ( int )( ( ptrdiff_t )( ( temp_13 ) & 0xFFFFFFFF ) );
                         ^
Взломщик не сможет взломать бинарник, если у никакого бинарника его не будет. Гениально!
Миниатюры
Попытка неявного изменения переменной  
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
10.01.2020, 03:24
Цитата Сообщение от eva2326 Посмотреть сообщение
С логикой всё в порядке)))
С программой у вас не всё в порядке.
Неопределенное поведение
И почему же там неопределённое поведение?)))
Например, в стандарте C++11 скзано такое:
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n3337/basic.compound#3
If an object of type T is located at an address A, a pointer of type cv T* whose value is the address A is said to point to that object, regardless of how the value was obtained. [ Note: For instance, the address one past the end of an array ([expr.add]) would be considered to point to an unrelated object of the array's element type that might be located at that address.…
На всякий случай переведу))))
Если объект типа T располагается по адресу A, указатель типа cv T* чьё значение есть адрес A считается указывающим на тот объект, вне зависимости от того, как это значение [указателя] было получено. [Прим.: Например, [указатель со значением] адрес "элемента" за последним элементом массива будет считаться указывающим на анрилэйтед объект с типом элемента массива, если таковой вдруг располагается по данному [т.е. за концом массива] адресу…
То, что значение p это адрес b&b — ТС проверил.
Тогда что не так?)))
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
10.01.2020, 13:31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int main()
{
    int a = 1;
    int b = 8;
 
    std::intptr_t a_adress = reinterpret_cast<std::intptr_t>(&a);
    std::intptr_t b_adress = reinterpret_cast<std::intptr_t>(&b);
 
    printf("a     \t%p\n", &a);
    printf("a_adr \t%p\n", a_adress);
    printf("b     \t%p\n", &b);
    printf("b_adr \t%p\n\n", b_adress);
 
    int diff = b_adress - a_adress;
    printf("diff  \t%d\n\n", diff);
 
    std::intptr_t p_adress = a_adress + diff;
    int* p = reinterpret_cast<int*>(p_adress);
 
    printf("p     \t%p\n", p);
    printf("p_adr \t%p\n\n", p_adress);
 
    *p = 35;
 
    printf("a val \t%d\n", a);
    printf("b val \t%d\n", b);
 
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2020, 13:31
Помогаю со студенческими работами здесь

Попытка присвоить значение Null переменной
Подскажите, пожалуйста, как решить проблему. После нажатия кнопки &quot;Добавить&quot;, выходит сообщение об ошибке: &quot;Попытка присвоить...

Как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной
Подскажите, пожалуйста, как избежать изменения одной переменной ссылочного типа, когда изменяется значение другой переменной ссылочного...

Попытка присвоить переменной integer выражение real. Как исправить ошибку?
Здравствуйте, такой вопрос, как исправить данную ошибку? Задание такое: &quot;Заполните все элементы, которые больше 5, значением среднего...

Ошибка: попытка присвоить значение Null переменной, не принадлежащей к типу Variant
Всем привет, такое задание: есть главная форма, через которую находишь базу данных. В этой же форме пишешь SQL код для запроса, и должен...

Метод Симпсона - попытка присвоить значение integer переменной типа real
Как исправить ошибку? В строке N2:= n/2; пишет попытка присвоить значение integer переменной типа real. Не могу понять что не так? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru