1 Востаннє редагувалося Chemist-i (06.05.2019 10:47:25)

Тема: Переповнення char'ів

#include <stdio.h>
int main() {
    for (char i = 0; i < 200; i++)
    {
        printf("%d:%c\n", i, i);
    }
    return 0;
}

зкомпілюйте, словами не описати. після запуску підвисає і програму нічим неможливло закрити, навіть після завершення процесу диспетчером завдань, процес csrss.exe зберігає вікно, а його завершити не можна. в чому причина? чому цикл повторяється вічно? і чому під час виконання програми з динаміків лунають голосні гудки? система Windows 7 Pro

2

Re: Переповнення char'ів

Exe-шнік написав:

після запуску підвисає ... в чому причина? чому цикл повторяється вічно?

Програма містить вічний цикл. Умова i < 200 завжди true, бо char i має діапазон значень [-128,+127].

Exe-шнік написав:

програму нічим неможливло закрити

Закрити можливо. Для цього потрібно вбити процес.

Exe-шнік написав:

і чому під час виконання програми з динаміків лунають голосні гудки?

Бо система виводить символ керування '\a' при i == 7 і результатом такого виводу є beep.

Подякували: FakiNyan, koala, LoganRoss4

3

Re: Переповнення char'ів

Дякую! Закрити то можливо, от тільки після вбиття процесу залишається висіти вікно командної строки. Коли я натискаю в диспетчері завдань праву клавішу миші на вікні з строкою - перейти до процесу - переходить до csrss.exe, я ж говорив спробувати скопмілювати. А потім пише "процес не відповідає. закрити примусово?" я натискаю так і через хвилину вікно строки зникає.
Я не знав, що від -128 до +127. А це так всюди, чи тільки в windows?

4 Востаннє редагувалося wander (05.05.2019 20:58:13)

Re: Переповнення char'ів

Exe-шнік написав:

Я не знав, що від -128 до +127. А це так всюди, чи тільки в windows?

Ні, не всюди, стандарт говорить, що діапазон char має бути,
як мінімум [-128,+127] але це implementation-defined, як і
те, що plain char може бути, як signed, так і unsigned.
В вашому випадку в циклі ви маєте UB, через переповнення
знакових.

Подякували: leofun01, ReAl3

5

Re: Переповнення char'ів

А чи всюди символи одні і ті ж самі?
Наприклад, мені вивело ось таку табличку

Прихований текст
-76:┤
-75:╡
-74:╢
-73:╖
-72:╕
-71:╣
-70:║
-69:╗
-68:╝
-67:╜
-66:╛
-65:┐
-64:└
-63:┴
-62:┬
-61:├
-60:─
-59:┼
-58:╞
-57:╟
-56:╚
-55:╔
-54:╩
-53:╦
-52:╠
-51:═
-50:╬
-49:╧
-48:╨
-47:╤
-46:╥
-45:╙
-44:╘
-43:╒
-42:╓
-41:╫
-40:╪
-39:┘
-38:┌
-37:█
-36:▄
-35:▌
-34:▐
-33:▀
-32:р
-31:с
-30:т
-29:у
-28:ф
-27:х
-26:ц
-25:ч
-24:ш
-23:щ
-22:ъ
-21:ы
-20:ь
-19:э
-18:ю
-17:я
-16:Ё
-15:ё
-14:Є
-13:є
-12:Ї
-11:ї
-10:Ў
-9:ў
-8:°
-7:∙
-6:·
-5:√
-4:№
-3:¤
-2:■
-1: 
0:
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:0
49:1
50:2
51:3
52:4
53:5
54:6
55:7
56:8
57:9
58::
59:;
60:<
61:=
62:>
63:?
64:@
65:A
66:B
67:C
68:D
69:E
70:F
71:G
72:H
73:I
74:J
75:K
76:L
77:M
78:N
79:O
80:P
81:Q
82:R
83:S
84:T
85:U
86:V
87:W
88:X
89:Y
90:Z
91:[
92:\
93:]
94:^
95:_
96:`
97:a
98:b
99:c
100:d
101:e
102:f
103:g
104:h
105:i
106:j
107:k
108:l
109:m
110:n
111:o
112:p
113:q
114:r
115:s
116:t
117:u
118:v
119:w
120:x
121:y
122:z
123:{
124:|
125:}
126:~
127:⌂
-128:
-127:
-126:
-125:
-124:
-123:
-122:
-121:
-120:
-119:
-118:
-117:
-116:
-115:
-114:
-113:
-112:
-111:
-110:
-109:
-108:
-107:
-106:
-105:
-104:
-103:
-102:
-101:
-100:
-99:Э
-98:Ю
-97:Я
-96:а
-95:б
-94:в
-93:г
-92:д
-91:е
-90:ж
-89:з
-88:и
-87:й
-86:к
-85:л
-84:м
-83:н
-82:о
-81:п
-80:░
-79:▒
-78:▓
-77:│
-76:┤
-75:╡
-74:╢
-73:╖
-72:╕
-71:╣
-70:║
-69:╗
-68:╝
-67:╜
-66:╛
-65:┐
-64:└
-63:┴
-62:┬
-61:├
-60:─
-59:┼
-58:╞
-57:╟

тільки я от не розумію чому саме так, я ж не задавав в тому циклі мінусів, це те що я скопіював зупинивши цикл правою клавішею миші по строці. всі символи у всіх системах такі? деякі я не розумію, для чого вони потрібні? такі як ╛, ├ - взагалі не розумію

6 Востаннє редагувалося wander (05.05.2019 21:13:16)

Re: Переповнення char'ів

Exe-шнік написав:

А чи всюди символи одні і ті ж самі?
Наприклад, мені вивело ось таку табличку

Прихований текст
-76:┤
-75:╡
-74:╢
-73:╖
-72:╕
-71:╣
-70:║
-69:╗
-68:╝
-67:╜
-66:╛
-65:┐
-64:└
-63:┴
-62:┬
-61:├
-60:─
-59:┼
-58:╞
-57:╟
-56:╚
-55:╔
-54:╩
-53:╦
-52:╠
-51:═
-50:╬
-49:╧
-48:╨
-47:╤
-46:╥
-45:╙
-44:╘
-43:╒
-42:╓
-41:╫
-40:╪
-39:┘
-38:┌
-37:█
-36:▄
-35:▌
-34:▐
-33:▀
-32:р
-31:с
-30:т
-29:у
-28:ф
-27:х
-26:ц
-25:ч
-24:ш
-23:щ
-22:ъ
-21:ы
-20:ь
-19:э
-18:ю
-17:я
-16:Ё
-15:ё
-14:Є
-13:є
-12:Ї
-11:ї
-10:Ў
-9:ў
-8:°
-7:∙
-6:·
-5:√
-4:№
-3:¤
-2:■
-1: 
0:
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:0
49:1
50:2
51:3
52:4
53:5
54:6
55:7
56:8
57:9
58::
59:;
60:<
61:=
62:>
63:?
64:@
65:A
66:B
67:C
68:D
69:E
70:F
71:G
72:H
73:I
74:J
75:K
76:L
77:M
78:N
79:O
80:P
81:Q
82:R
83:S
84:T
85:U
86:V
87:W
88:X
89:Y
90:Z
91:[
92:\
93:]
94:^
95:_
96:`
97:a
98:b
99:c
100:d
101:e
102:f
103:g
104:h
105:i
106:j
107:k
108:l
109:m
110:n
111:o
112:p
113:q
114:r
115:s
116:t
117:u
118:v
119:w
120:x
121:y
122:z
123:{
124:|
125:}
126:~
127:⌂
-128:
-127:
-126:
-125:
-124:
-123:
-122:
-121:
-120:
-119:
-118:
-117:
-116:
-115:
-114:
-113:
-112:
-111:
-110:
-109:
-108:
-107:
-106:
-105:
-104:
-103:
-102:
-101:
-100:
-99:Э
-98:Ю
-97:Я
-96:а
-95:б
-94:в
-93:г
-92:д
-91:е
-90:ж
-89:з
-88:и
-87:й
-86:к
-85:л
-84:м
-83:н
-82:о
-81:п
-80:░
-79:▒
-78:▓
-77:│
-76:┤
-75:╡
-74:╢
-73:╖
-72:╕
-71:╣
-70:║
-69:╗
-68:╝
-67:╜
-66:╛
-65:┐
-64:└
-63:┴
-62:┬
-61:├
-60:─
-59:┼
-58:╞
-57:╟

тільки я от не розумію чому саме так, я ж не задавав в тому циклі мінусів, це те що я скопіював зупинивши цикл правою клавішею миші по строці. всі символи у всіх системах такі? деякі я не розумію, для чого вони потрібні? такі як ╛, ├ - взагалі не розумію

Виведені символи співставляються з таблицею ASCII, де певна цифра,
це якийсь символ. Проте враховуючи той факт, що С++ не наполягає
на ASCII, немає гарантії, що вона повинна бути всюди.

Exe-шнік написав:

я от не розумію чому саме так, я ж не задавав в тому циклі мінусів

Я ж вам кажу у вас в коді UB, тому там і появляються мінуси.

А ну і так, не всі ASCII символи є printable.

Подякували: leofun012

7

Re: Переповнення char'ів

Дякую!  Тепер наче все зрозуміло :)
Перший раз маю таке, я вже було подумав що раз гудки давати почало, то скоро і файли видаляти почне. Подумав, що програма в якісь не ті реєстри процесора звертається. Зараз подивився наче всі файли цілі. То ви говорите що "\a" дає гудок? А є щось таке "\x", де x таке що якось шкодить системі?

8 Востаннє редагувалося wander (05.05.2019 21:25:52)

Re: Переповнення char'ів

Exe-шнік написав:

То ви говорите що "\a" дає гудок?

Весь список https://en.cppreference.com/w/cpp/language/escape

Exe-шнік написав:

А є щось таке "\x", де x таке що якось шкодить системі?

"\x" - такого модифікатора немає
https://en.cppreference.com/w/cpp/language/ascii

Exe-шнік написав:

де x таке що якось шкодить системі?

Ні, максимум хто може нашкодити вашій системі - це Ви ж.

Подякували: leofun012

9

Re: Переповнення char'ів

Exe-шнік написав:

після вбиття процесу залишається висіти вікно командної строки. Коли я натискаю в диспетчері завдань праку клавішу миші на вікні з строкою - перейти до процесу - переходить до csrss.exe, я ж говорив спробувати скопмілювати.

Я компілював і в мене не було просесу csrss.exe. Це вже особливість вашої системи.

Exe-шнік написав:

Я не знав, що від -128 до +127.

Більшість компіляторів дозволяють налаштувати компіляцію відповідно до ваших потреб. Наприклад працювати з char як з unsigned char.

Exe-шнік написав:

А чи всюди символи одні і ті ж самі?

Перші 128 символів ([0,+127]) будуть майже всюди однакові, а далі по різному, залежить від кодування і локалі.

Exe-шнік написав:

Подумав, що програма в якісь не ті реєстри процесора звертається. Зараз подивився наче всі файли цілі. То ви говорите що "\a" дає гудок? А є щось таке "\x", де x таке що якось шкодить системі?

Ukrvital, для чого ви палитесь. Все ж так добре починалось.

10

Re: Переповнення char'ів

Я запитав не те. я запитав чи є щось таке що можна підставити після "\" типу "\a",  але щоб при цьому був не гудок а видалявся якийсь файл? чи щось подібне відбувалося, пов'язане з зовнішніми пристроями, як-от динамік, диск, монітор, порти?

11

Re: Переповнення char'ів

Exe-шнік написав:

чи є щось таке що можна підставити після "\" типу "\a",  але щоб при цьому був не гудок а видалявся якийсь файл?

Ні. Я ж вам дав весь список всіх модифікаторів що є.
Ви там бачите такий, що б дозволяв видалити файл?

12

Re: Переповнення char'ів

Я нічого не палюся я просто не знаю чи дійно із системою все добре після запуску програми.
Я боюся я не знаю що воно із того що ви дали,

\'    single quote
\"    double quote
\?    question mark 
\\    backslash    byte 
\a    audible bell    
\b    backspace    byte 
\f    form feed 
\n    line feed - new line    
\r    carriage return    
\t    horizontal tab    
\v    vertical tab    
\nnn    arbitrary octal value    byte nnn
\xnn    arbitrary hexadecimal value    byte nn
\unnnn (since C++11)    universal character name
(arbitrary Unicode value);
may result in several characters    code point U+nnnn
\Unnnnnnnn (since C++11)    universal character name
(arbitrary Unicode value);
may result in several characters    code point U+nnnnnnnn

що означають останні, починаючи з \nnn?

13

Re: Переповнення char'ів

Exe-шнік написав:

Я боюся я не знаю що воно із того що ви дали

Попробуйте почитати, що там заправа пише, а саме в колонці
під назвою Description, зазвичай допомагає.

Exe-шнік написав:

що означають останні, починаючи з \nnn?

Де Ви там побачили "\nnn"?
Там є "\unnnn" і "\Unnnnnnnn". І що воно таке там теж пише.

A universal character name in a narrow string literal or a 16-bit string literal may map to more than one character, e.g. \U0001f34c is 4 char code units in UTF-8 (\xF0\x9F\x8D\x8C) and 2 char16_t code units in UTF-16 (\uD83C\uDF4C).

14

Re: Переповнення char'ів

adziri написав:
Exe-шнік написав:

що означають останні, починаючи з \nnn?

Де Ви там побачили "\nnn"?

Є там таке. Символи можна записувати числами у вісімковій системі.

'\101' == 'A'
'\101' == '\x41'
'\101' == '\u0041'

15

Re: Переповнення char'ів

Вибачте, deskription я китайську не розумію
e.g. \U0001f34c
\xF0\x9F\x8D\x8C
\uD83C\uDF4C
що воно за хрінь?

16

Re: Переповнення char'ів

leofun01 написав:
adziri написав:
Exe-шнік написав:

що означають останні, починаючи з \nnn?

Де Ви там побачили "\nnn"?

Є там таке. Символи можна записувати числами у вісімковій системі.

'\101' == 'A'
'\101' == '\x41'
'\101' == '\u0065'

В любому випадку там є поле опису, де пише, що та чи
інша "команда" робить.

Подякували: leofun011

17 Востаннє редагувалося wander (06.05.2019 10:19:04)

Re: Переповнення char'ів

Exe-шнік написав:

Вибачте, deskription я китайську не розумію
e.g. \U0001f34c
\xF0\x9F\x8D\x8C
\uD83C\uDF4C
що воно за хрінь?

\U0001f34c - це universal character name
\xF0\x9F\x8D\x8C - це arbitrary hexadecimal value
\uD83C\uDF4C - це теж universal character name

universal character name - це представлення символів за межами
основного (стандартного) набору символів.

Стандарт C++ визначає універсальні імена символів, написані як
"\unnnn" і "\Unnnnnnnn", та представляє символи з юнікодівськими
кодовими точками nnnn/nnnnnnnn (де n якесь hex число).
Це корисно для рядкових літералів, тим більше, що літерали
UTF-8, UTF-16 і UCS-4 є явно визначеними.
Однак universal character literals (той же символ банану \U0001f34)
також дозволені в ідентифікаторах*.
*ідентифікатор в С++ - це довільно довга послідовність цифр,
символів підкреслення, малих та великих латинських букв,
а також більшості символів Unicode.

Для чого це було потрібно? Ну, наприклад:
Програми C++ можуть викликати функції, написані іншими мовами.
Це хороша стратегія з боку комітету зі стандартизації, щоб гарантувати,
що C++ буде сумісним з іншими мовами, які можуть дозволяти
не алфавітно-цифрові символи або символи юнікоду в іменах функцій,
навіть якщо такі мови ще не існують. Стандарт не повинен вказувати,
як це буде працювати на рівні лінкера тощо;
але це добре, що є деякий визначений механізм, який дозволяє це.

Щодо arbitrary hexadecimal value або "\xnn", де nn - це просто
послідовність шістнадцяткових цифр, які означають символ з ASCII-кодом nn.

Подякували: leofun01, ReAl3

18

Re: Переповнення char'ів

Хух. Я ж кажу, що китайську я не розумію. І чому ви так вороже настроєні теж. Все наче нормально починалося. Я тільки спитав чи можуть нанести якусь шкоду моїй системі не printable символи і все, тут немає нічого поганого.

Прихований текст

Якщо ви маєте на увазі що я хочу зашкодити чиїйсь системі, то для цього мені ця програма і на хрін не потрібна, я скачаю готовий архів з вірусами для перевірки антивірусу, заражу файли і викладу в інтернеті.

Мені потрібно лише дізнатися чи могло з моїм компом щось статися після запуску програми, я не знав, що через вивід символів printf можна звертатися до зовнішніх пристроїв, як динамік

19

Re: Переповнення char'ів

Exe-шнік написав:

Мені потрібно лише дізнатися чи могло з моїм компом щось статися після запуску програми

Ні, не могло.

Exe-шнік написав:

я не знав, що через вивід символів printf можна звертатися до зовнішніх пристроїв, як динамік

Це залежить від операційної системи. Старий MS-DOS викликав
звук материнської плати. Якщо ви працюєте з більш новою ОС,
то варто очікувати, що ядро буде викликати звуковий сигнал
від динаміка, а не апаратного якогось біпу.

Подякували: leofun011

20

Re: Переповнення char'ів

Я попробував знайти в інтернеті хоча б щось про екранування символів українською мовою і не знайшов. Тому

Екранування символів / Послідовності екранування / Escape sequences
послідовність                                       байт в кодуванні ASCII
\0    нуль-символ           null character          0x00
\'    одинарна лапка        single quote            0x27
\"    подвійна лапка        double quote            0x22
\?    знак питання          question mark           0x3f
\\    зворотній слеш        backslash               0x5c
\a    звуковий сигнал       audible bell            0x07
\b    1 символ назад        backspace               0x08
\f    нова сторінка         form feed - new page    0x0c
\n    новий рядок           line feed - new line    0x0a
\r    на початок рядка      carriage return         0x0d
\t    горизонтальний таб    horizontal tab          0x09
\v    вертикальний таб      vertical tab            0x0b

\nnn                  довільне вісімкове число
\xnn                  довільне шіснадцяткове число
\unnnn     (C++11)    універсальне ім'я (результатом може бути кілька символів)
\Unnnnnnnn (C++11)    універсальне ім'я (результатом може бути кілька символів)
Подякували: Chemist-i, ReAl2