Sscanf warning string buffer overflow как исправить

  • Главная
  • Форум
  • Pawn-скриптинг, SA:MP
  • Вопросы по Pawn-скриптингу
  • [Вопрос] sscanf warning: String buffer overflow.


  1. 13.06.2016, 15:49


    #1

    Аватар для Danny_Marcelo

    Пользователь


    sscanf warning: String buffer overflow.

    Всем привет. У меня такой вопрос. Как многие знают, я занимаюсь модом Funny RP. Так вот, как написал Daniel_Cortez:

    Сам собой напрашивается вопрос: зачем вообще к моду подключен sscanf2? Ради пары отрывков кода, которые лень переделать?
    Кстати, sscanf2 используется в моде всего 5 раз.
    Вот самое первое место, где он встречается:
    PHP код:
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    new string[256];
    new tmp[128],idx;
    new cmd[128];
    new giveplayerid;
    cmd = strtok(cmdtext,idx);
    // sscanf
    new command[32], params[128];
    sscanf(cmdtext, «s[32]s[128]», command, params);
    Параметры команды отделяются от названия сразу двумя способами, в лучших быдлокодерских традициях.
    И присмотритесь внимательно к форматной строке в sscanf: «s[32]s[128]». В переменную params ничего не запишется, вместо этого и название, и параметры окажутся в command. Мало того, если длина команды и параметров в сумме больше 31 символа, sscanf выплюнет сообщение в лог «sscanf warning: String buffer overflow» — и после этого гадай, откуда берётся такое сообщение.
    В остальных 4 случаях с помощью sscanf2 в командах (OnPlayerCommandText) обрабатываются параметры из params, но поскольку в params ничего нет, то команды будут работать не так, как задумано.

    Ну вот попробовал наконец добавить команду с использованием sscanf и у меня в консоли выбило:

    PHP код:


    sscanf warningString buffer overflow


    Ну как я понял, переполнение буфера. Но Daniel_Cortez сказал, что sscanf подключен к моду не правильно, по этому будут такие ошибки.

    Так как же правильно подключить sscanf к моду? Я гуглил, везде одно и тоже и в моде тоже самое. Прошу по этому вашей помощи. Заранее благодарю.

    Вот собственно подключение к sscanf.

    PHP код:


    public OnPlayerCommandText(playeridcmdtext[])
    {
         new 
    string[256];
        new 
    tmp[128],idx;
        new 
    cmd[128];
        new 
    giveplayerid;
        
    cmd strtok(cmdtext,idx);
        
    // sscanf
        
    new command[32], params[128];
        
    sscanf(cmdtext"s[32]s[128]"commandparams); 


    Ну а вот тестовая команда:

    PHP код:


    if(strcmp(cmd"/msg"true) == 0)
        {
            static const 
    fmt_str[] = "Администратор %s: %s";
            new 
    str[sizeof fmt_str 16 MAX_PLAYER_NAME 50];
            if(
    PlayerInfo[playerid][pAdmin] < 4) return true;
            if(
    sscanf(params"s[50]"params[0])) return SendClientMessage(playeridCOLOR_GREY"Используйте: /msg [текст]");
            
    format(strsizeof(str), fmt_strPlayerInfo[playerid][pName], params[0]);
            
    SendClientMessageToAll(0xFFCC00AAstr);
            return 
    true;
        } 


    Если тут написать текст больше 50, то в консоли выбивает про буфер. Я пробовал изменять на 128 и т.д., но все равно, если больше напишешь символов, то будет снова это сообщение. P.S. используется sscanf 2.8.1



  2. 15.06.2016, 17:53


    #2

    Аватар для Danny_Marcelo

    Пользователь


    Ну и? Кто нибудь поможет? Где все профессионалы?



  3. 15.06.2016, 18:11


    #3

    Аватар для Sp1ke

    Пользователь


    Цитата Сообщение от Danny_Marcelo
    Посмотреть сообщение

    Ну и? Кто нибудь поможет? Где все профессионалы?

    Поэтому и надо делать ограничение на кол-во символов, понятное же дело



  4. 15.06.2016, 21:59


    #4

    Аватар для nikvlad

    Пользователь


    Код:

    if(sscanf(params, "?<SSCANF_QUIET=1>s[50]", params[0])) return SendClientMessage(playerid, COLOR_GREY, "Используйте: /msg [текст]");


  5. Пользователь сказал cпасибо:


  6. 16.06.2016, 09:18


    #5

    Цитата Сообщение от Danny_Marcelo
    Посмотреть сообщение

    Так как же правильно подключить sscanf к моду?

    PHP код:


    #include <sscanf2> 


    Худшее, что здесь можно сделать — неправильно написать название инклуда или забыть скопировать сам инклуд в pawno/include. В любом случае компилятор укажет на такую ошибку.

    Цитата Сообщение от Danny_Marcelo
    Посмотреть сообщение

    Вот собственно подключение к sscanf.

    PHP код:


    public OnPlayerCommandText(playeridcmdtext[])
    {
         new 
    string[256];
        new 
    tmp[128],idx;
        new 
    cmd[128];
        new 
    giveplayerid;
        
    cmd strtok(cmdtext,idx);
        
    // sscanf
        
    new command[32], params[128];
        
    sscanf(cmdtext"s[32]s[128]"commandparams); 


    «Подключение» и «использование» — совершенно разные вещи…

    Цитата Сообщение от Danny_Marcelo
    Посмотреть сообщение

    Ну а вот тестовая команда:

    PHP код:


    if(strcmp(cmd"/msg"true) == 0)
        {
            static const 
    fmt_str[] = "Администратор %s: %s";
            new 
    str[sizeof fmt_str 16 MAX_PLAYER_NAME 50];
            if(
    PlayerInfo[playerid][pAdmin] < 4) return true;
            if(
    sscanf(params"s[50]"params[0])) return SendClientMessage(playeridCOLOR_GREY"Используйте: /msg [текст]");
            
    format(strsizeof(str), fmt_strPlayerInfo[playerid][pName], params[0]);
            
    SendClientMessageToAll(0xFFCC00AAstr);
            return 
    true;
        } 


    Если тут написать текст больше 50, то в консоли выбивает про буфер.

    Ну так правильно, нужно делать буфер под столько символов, сколько игрок может ввести, а не сколько захочет левая пятка.

    Цитата Сообщение от Danny_Marcelo
    Посмотреть сообщение

    Я пробовал изменять на 128 и т.д., но все равно, если больше напишешь символов, то будет снова это сообщение.

    Каждая строка должна заканчиваться нуль-символом » (должна же машина как-то знать, где заканчивается последовательность символов), под который нужна ещё одна ячейка в массиве. В итоге в OPCT массивы command и params должны быть оба размером в 129 ячеек.

    Есть ещё вариант посложнее, но использующий только один массив в 129 ячеек вместо двух. Вместо того, чтобы использовать sscanf2, можно скопировать всё содержимое cmdtext в массив command, пройтись циклом по массиву, найти первый пробел и записать на его месте », затем пропустить лишние пробелы между командой и параметрами (да, их там может быть больше одного) и записать позицию, где начинаются параметры команды, в переменную params_start_pos. В итоге сама команда будет в массиве command, а вместо params можно будет использовать command[params_start_pos].
    А вообще для подобных манипуляций есть командные процессоры, кои я и советую вам использовать.

    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы

    здесь (click)

    .



  7. Пользователь сказал cпасибо:


  8. 16.06.2016, 18:59


    #6

    Аватар для Battista

    Пользователь


    new cmd[64],params[64],idx;
    cmd = strtok(cmdtext, idx);
    sscanf(cmdtext,»s[32]s[64]»,cmd,params);



  9. Пользователь сказал cпасибо:


  10. 17.06.2016, 13:07


    #7

    Цитата Сообщение от Battista
    Посмотреть сообщение

    new cmd[64],params[64],idx;
    cmd = strtok(cmdtext, idx);
    sscanf(cmdtext,»s[32]s[64]»,cmd,params);

    Команда может быть длиннее 31 символа, а параметры — длиннее 63 (сразу будет заметно в чатовых командах типа /s, /a, /pm, /sms и т.п.).

    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы

    здесь (click)

    .



  11. 17.06.2016, 13:24


    #8

    Цитата Сообщение от Daniel_Cortez
    Посмотреть сообщение

    Команда может быть длиннее 31 символа, а параметры — длиннее 63 (сразу будет заметно в чатовых командах типа /s, /a, /pm, /sms и т.п.).

    Почему 63? Разве длинна строки параметра — это не остаток от лимита ввода в чат (128) минус лимит длины имени функции (31)?



  12. 17.06.2016, 13:37


    #9

    Цитата Сообщение от Anton Styazhkin
    Посмотреть сообщение

    Почему 63? Разве длинна строки параметра — это не остаток от лимита ввода в чат (128) минус лимит длины имени функции (31)?

    Именно.
    Кстати, по поводу моего первого поста в этой теме, небольшая поправка: если команда может быть длиной от 2 до 128 символов, то максимальная длина параметров будет равна 129 — 2 — 1 = 126 символов. В итоге под массив params потребуется не 129, а 126 ячеек.

    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы

    здесь (click)

    .



  13. 17.06.2016, 13:44


    #10

    Цитата Сообщение от Daniel_Cortez
    Посмотреть сообщение

    Именно.
    Кстати, по поводу моего первого поста в этой теме, небольшая поправка: если команда может быть длиной от 2 до 128 символов, то максимальная длина параметров будет равна 129 — 2 — 1 = 126 символов. В итоге под массив params потребуется не 129, а 126 ячеек.

    Учет пробелов и ‘/’ всегда должен быть, если ты об этом.


 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)


Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
  • BB коды Вкл.
  • Смайлы Вкл.
  • [IMG] код Вкл.
  • [VIDEO] код Вкл.
  • HTML код Выкл.

Правила форума


#1

Пользователь офлайн
 

Отправлено 23 апреля 2017 — 22:39

  • Прохожий

Здравствуйте, при игре на сервере минут через 10 отключается сервер(приходится перезагружать на сервере) и выдает такой ЛОГ
[22:01:25] [connection] 93.100.213.40:52006 requests connection cookie.
[22:01:26] [connection] incoming connection: 93.100.213.40:52006 id: 0
[22:01:26] [join] Jayson_Keemble has joined the server (0:93.100.213.40)
[22:01:36] FindPlayerInTable | Jayson_Keemble[0] — 2
[22:01:42] [RegCheck] Jayson_Keemble > Jayson_Keemble
[22:01:42] Name: Jayson_Keemble [0] | pID: [2]
[22:01:49] sscanf warning: String buffer overflow.
[22:01:49] sscanf warning: String buffer overflow.
[22:03:47] id=’0′,subid=’1′
[22:15:49] id=’0′,subid=’0′

0



#2

Отправлено 24 апреля 2017 — 00:23

  • Местный
sscanf warning: String buffer overflow

Название говорит за себя. Переполнен буфер. В вызове функции вы указываете, что строка может иметь длину, например, 15 символов (s[15]) а на деле в sscanf поступает строка из 16 или 1000 символов. В общем, превышен предел

Сообщение отредактировал leonid767: 24 апреля 2017 — 00:24

0



#3

Отправлено 24 апреля 2017 — 13:04

  • Assassin Of Scripters

Просмотр сообщенияleonid767 (24 апреля 2017 — 00:23) писал:

sscanf warning: String buffer overflow

Название говорит за себя. Переполнен буфер. В вызове функции вы указываете, что строка может иметь длину, например, 15 символов (s[15]) а на деле в sscanf поступает строка из 16 или 1000 символов. В общем, превышен предел

Что?
s[15] — это минимум кол-во ячеек которое должно поступить.

Он указал в sscanf(params, «s», result), а result содержит 15 ячеек, тем самым буфер будет переполнен.

0



#4

Отправлено 24 апреля 2017 — 14:02

  • Знаток

Просмотр сообщенияLong- (24 апреля 2017 — 13:04) писал:

Что?
s[15] — это минимум кол-во ячеек которое должно поступить.

Он указал в sscanf(params, «s», result), а result содержит 15 ячеек, тем самым буфер будет переполнен.

s[15] — это МАКСИМУМ кол-во ячеек которое должно поступить.

0



#5

Отправлено 24 апреля 2017 — 14:53

  • По всем вопросам пишите в профиль. Консультации в ВК не провожу.

Просмотр сообщенияManifest_Elgujak (24 апреля 2017 — 14:02) писал:

s[15] — это МАКСИМУМ кол-во ячеек которое должно поступить.

А что тебя тут не устраивает?
Если юзер решит увеличить строку — он вновь получит извещение о недостатке ячеек, поэтому, 15 — это экстремум, в данном случае.

0



#6

Отправлено 24 апреля 2017 — 15:48

  • Прохожий

Я так и непонял, что нужно делать)

0



#7

Отправлено 24 апреля 2017 — 19:11

  • Местный

Все поспорили и не кто не ответил)
А крашит не по этому ищи ошибку дальше. Это варн который говорит о не правильной работе
Вот пример исправления его
например у тебя есть переменная
new st[3]; — ты в нее можешь записать 3 символа например слово баг
а ты пытаешься записать бага на один символ больше вот он и пишет варн
Чтоб не было такого new st[3]; надо заминать на new st[4]; или больше.
Можно еще по другому например

new st[] = «баги», stim[3];
sscanf(st, «s[3]»,stim);

То есть мы доем понять что в переменную stim можно вставить только 3 символа.
Надеюсь помог

Сообщение отредактировал leonid767: 24 апреля 2017 — 19:14

0



#8

Отправлено 24 апреля 2017 — 19:43

  • Прохожий

Просмотр сообщенияleonid767 (24 апреля 2017 — 19:11) писал:

Все поспорили и не кто не ответил)
А крашит не по этому ищи ошибку дальше. Это варн который говорит о не правильной работе
Вот пример исправления его
например у тебя есть переменная
new st[3]; — ты в нее можешь записать 3 символа например слово баг
а ты пытаешься записать бага на один символ больше вот он и пишет варн
Чтоб не было такого new st[3]; надо заминать на new st[4]; или больше.
Можно еще по другому например

new st[] = «баги», stim[3];
sscanf(st, «s[3]»,stim);

То есть мы доем понять что в переменную stim можно вставить только 3 символа.
Надеюсь помог

Спасибо! Попробую найти с чем же связана ошибка.

0



#9

Отправлено 24 апреля 2017 — 20:52

  • Профессионал

0



#10

Отправлено 24 апреля 2017 — 21:26

  • По всем вопросам пишите в профиль. Консультации в ВК не провожу.

Просмотр сообщенияleonid767 (24 апреля 2017 — 19:11) писал:

Все поспорили и не кто не ответил)
А крашит не по этому ищи ошибку дальше. Это варн который говорит о не правильной работе
Вот пример исправления его
например у тебя есть переменная
new st[3]; — ты в нее можешь записать 3 символа например слово баг
а ты пытаешься записать бага на один символ больше вот он и пишет варн
Чтоб не было такого new st[3]; надо заминать на new st[4]; или больше.
Можно еще по другому например

new st[] = «баги», stim[3];
sscanf(st, «s[3]»,stim);

То есть мы доем понять что в переменную stim можно вставить только 3 символа.
Надеюсь помог

Всё потому, что индекс ячеек массива начинается с нуль-элемента.
array[4] = array[0] + array[1] + array[2] + array[3].

-1


  • ← Предыдущая тема
  • Вопросы по скриптингу
  • Следующая тема →

  • Вы не можете создать новую тему
  • Тема закрыта


1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей

[18:04:15] hostname = «SA:MP Server» (string)
[18:04:15] filterscripts = «» (string)
[18:04:15] weburl = «www.sa-mp.com» (string)
[18:04:15]
[18:04:15] Server Plugins
[18:04:15] —————
[18:04:15] Loading plugin: streamer
[18:04:15]

*** Streamer Plugin v2.8.2 by Incognito loaded ***

[18:04:15] Loaded.
[18:04:15] Loading plugin: sscanf
[18:04:15]

[18:04:15] ===============================

[18:04:15] sscanf plugin loaded.

[18:04:15] Version: 2.8.1

[18:04:15] (c) 2012 Alex «Y_Less» Cole

[18:04:15] ===============================

[18:04:15] Loaded.
[18:04:15] Loading plugin: mysql
[18:04:15]

&gt; MySQL plugin R5 successfully loaded.

[18:04:15] Loaded.
[18:04:15] Loading plugin: crashdetect
[18:04:15] CrashDetect must be loaded before ‘streamer.DLL’
[18:04:15] Failed.
[18:04:15] Loading plugin: crp
[18:04:15]

[18:04:15] ______________________________________

[18:04:15] Convert Rus To Pwn v0.1.1 loaded
[18:04:15] ______________________________________

[18:04:15] By: Fro (c) Copyright &lt;TBG&gt; 2009-2011
[18:04:15] ______________________________________

[18:04:15] Loaded.
[18:04:15] Loaded 4 plugins.

[18:04:15]
[18:04:15] Filterscripts
[18:04:15] —————
[18:04:15] Loaded 0 filterscripts.

[18:04:15] OnGameModeInit() STK 16288
[18:04:15]
———————————-
[18:04:15] [GAMENIX MSG]: Успешная загрузка ‘LoadHouses’ — загружено 76 за 155 м.с
[18:04:15] [GAMENIX MSG]: Успешная загрузка ‘LoadBizz’ — загружено 0 за 4 м.с
[18:04:15] [GAMENIX MSG]: Успешная загрузка ‘LoadVehicle’ — загружено 56 за 112 м.с
[18:04:15] [SMSG]: Успешная загрузка ‘LoadEnters’ — загружено 20 пикапов за 44 м.с
[18:04:15] [SMSG]: Успешная загрузка ‘LoadATM’ — загружено 0 банкоматов за 6 м.с
[18:04:15] [SMSG]: Успешная загрузка ‘LoadPodezd’ — загружено 33 подьездов за 71 м.с
[18:04:17] [SMSG]: Успешная загрузка ‘LoadRooms’ — загружено 673 квартир за 1301 м.с
[18:04:17] [SMSG]: Успешная загрузка ‘LoadMayor’ за 4 м.с
[18:04:17] [GAMENIX MSG]: Успешная загрузка ‘LoadOther’ за 4 м.с
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] sscanf warning: String buffer overflow.
[18:04:17] [GAMENIX MSG]: Успешная загрузка ‘LoadFrac’ — загружено 20 за 47 м.с
[18:04:17] OnGameModeInit() STK 16280 (4 LOSS)
[18:04:17] ==============================================
[18:04:17] Подключение к базе `G-RP` успешно
[18:04:17] ==============================================
[18:04:17] Number of vehicle models: 49 

Достала эта ошибка!!!

sscanf обновил — не помогло!

  • 0


Zishka

Вопросы

Всем привет! Опять встретился с ошибкой sscanf в консоле(

Помогите исправить пожалуйста :$

Консоль:

Спойлер

———-
Loaded log file: «server_log.txt».
———-

SA-MP Dedicated Server
———————-
v0.3e, (C)2005-2012 SA-MP Team

[20:50:04] weburl = «www.sa-mp.com»  (string)
[20:50:04] password = «»  (string)
[20:50:04] 
[20:50:04] Server Plugins
[20:50:04] —————
[20:50:04]  Loading plugin: streamer
[20:50:04] 

*** Streamer Plugin v2.6.1 by Incognito loaded ***

[20:50:04]   Loaded.
[20:50:04]  Loading plugin: sscanf
[20:50:04] 

[20:50:04]  ===============================

[20:50:04]       sscanf plugin loaded.     

[20:50:04]    (c) 2009 Alex «Y_Less» Cole

[20:50:04]    0.3d-R2 500 Players «dnee»

[20:50:04]  ===============================

[20:50:04]   Loaded.
[20:50:04]  Loading plugin: mysql
[20:50:04] 

  > MySQL plugin R5 successfully loaded.

[20:50:04]   Loaded.
[20:50:04]  Loaded 3 plugins.

[20:50:04] 
[20:50:04] Filterscripts
[20:50:04] —————
[20:50:04]   Loaded 0 filterscripts.

[20:50:04] password = «»  (string)
[20:50:04] MySQL: Подключение к базе данных установлено.
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadHouses’ — загружено 0 за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadBizz’ — загружено 0 за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadVehicle’ — загружено 22 за 38 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadEnters’ — загружено 54 пикапов за 39 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadATM’ — загружено 0 банкоматов за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadPodezd’ — загружено 0 подьездов за 3 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadRooms’ — загружено 0 квартир за 2 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadMayor’ за 3 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadOther’ за 3 м.с
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] sscanf warning: String buffer overflow.
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadFrac’ — загружено 20 за 24 м.с
[20:50:04] ARPLOAD: Успешная загрузка ‘LoadPromo’ — загружено 0 за 2 м.с
[20:50:04] ==============================================
[20:50:04] Author — Jack_Yermolov Server — Old RolePlay©
[20:50:04]  Подключение к базе `rrp2` успешно
[20:50:04] ==============================================
[20:50:04] Number of vehicle models: 40

Возможная строка:

stock LoadOther()
{
	new time = GetTickCount();
	format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`");
	mysql_query(query);
	mysql_store_result();
	if(mysql_fetch_row(query) == 1)
	{
		mysql_fetch_row(query);
		sscanf(query, "p<|>iiiiiiiiiiiiis[40]iiiiiiiiiiiiiiiiiiiiiiiiiii",
		FracBank[0],
		FracBank[1],
		FracBank[3],
		FracBank[4],
		FracBank[5],
		FracBank[6],
		FracBank[7],
		FracBank[8],
		FracBank[9],
		sklads,
		ugol,
		drev,
		ed,
		NewsPrice,
		Mats[1],//Police
		Mats[2],//DPC
		Mats[0],///Army
		Mats[4],//FSB
		Mats[5],//GOP
		Mats[6],//LB
		Mats[8],//BB
		Mats[9],//UGBRATVA
		Mineral[0],//mineral
		Metal,
		Mineral[1],
//		FracBank[11],
		Mats[16],
		Mats[12],
		Mats[18],
		MafiaMineral[0],
		MafiaMineral[1],
		MafiaMineral[2],
		DrugsBank[F_GOPOTA],
		DrugsBank[F_LYTBRATVA],
		DrugsBank[F_BATBRATVA],
		DrugsBank[F_UGBRATVA],
		DrugsBank[F_YAKUZA],
		DrugsBank[F_LCN],
		DrugsBank[F_RM],
		FuelBank,
		Plavnya,
		TOTALPRIZ);
		sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]);
	}
	mysql_free_result();
	printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time);
	return true;
}

Поделиться сообщением


Ссылка на сообщение

7 ответов на этот вопрос

  • Сортировать по голосам
  • Сортировать по дате
  • 0

@Zishka, а так:

Спойлер

stock LoadOther()
{
	new time = GetTickCount();
	format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`");
	mysql_query(query);
	mysql_store_result();
	if(mysql_fetch_row(query) == 1)
	{
		mysql_fetch_row(query);
		sscanf(query, "p<|>iiiiiiiiiiiiis[40]iiiiiiiiiiiiiiiiiiiiiiiiiiii",
		FracBank[0],
		FracBank[1],
		FracBank[3],
		FracBank[4],
		FracBank[5],
		FracBank[6],
		FracBank[7],
		FracBank[8],
		FracBank[9],
		sklads,
		ugol,
		drev,
		ed,
		NewsPrice,
		Mats[1],//Police
		Mats[2],//DPC
		Mats[0],///Army
		Mats[4],//FSB
		Mats[5],//GOP
		Mats[6],//LB
		Mats[8],//BB
		Mats[9],//UGBRATVA
		Mineral[0],//mineral
		Metal,
		Mineral[1],
//		FracBank[11],
		Mats[16],
		Mats[12],
		Mats[18],
		MafiaMineral[0],
		MafiaMineral[1],
		MafiaMineral[2],
		DrugsBank[F_GOPOTA],
		DrugsBank[F_LYTBRATVA],
		DrugsBank[F_BATBRATVA],
		DrugsBank[F_UGBRATVA],
		DrugsBank[F_YAKUZA],
		DrugsBank[F_LCN],
		DrugsBank[F_RM],
		FuelBank,
		Plavnya,
		TOTALPRIZ);
		sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]);
	}
	mysql_free_result();
	printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time);
	return true;
}

Поделиться сообщением


Ссылка на сообщение

  • 0

Тоже-самое

19 часов назад, odosenok сказал:

@Zishka, а так:

  код (закрыть спойлер)

stock LoadOther()
{
	new time = GetTickCount();
	format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`");
	mysql_query(query);
	mysql_store_result();
	if(mysql_fetch_row(query) == 1)
	{
		mysql_fetch_row(query);
		sscanf(query, "p<|>iiiiiiiiiiiiis[40]iiiiiiiiiiiiiiiiiiiiiiiiiiii",
		FracBank[0],
		FracBank[1],
		FracBank[3],
		FracBank[4],
		FracBank[5],
		FracBank[6],
		FracBank[7],
		FracBank[8],
		FracBank[9],
		sklads,
		ugol,
		drev,
		ed,
		NewsPrice,
		Mats[1],//Police
		Mats[2],//DPC
		Mats[0],///Army
		Mats[4],//FSB
		Mats[5],//GOP
		Mats[6],//LB
		Mats[8],//BB
		Mats[9],//UGBRATVA
		Mineral[0],//mineral
		Metal,
		Mineral[1],
//		FracBank[11],
		Mats[16],
		Mats[12],
		Mats[18],
		MafiaMineral[0],
		MafiaMineral[1],
		MafiaMineral[2],
		DrugsBank[F_GOPOTA],
		DrugsBank[F_LYTBRATVA],
		DrugsBank[F_BATBRATVA],
		DrugsBank[F_UGBRATVA],
		DrugsBank[F_YAKUZA],
		DrugsBank[F_LCN],
		DrugsBank[F_RM],
		FuelBank,
		Plavnya,
		TOTALPRIZ);
		sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]);
	}
	mysql_free_result();
	printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time);
	return true;
}

Поделиться сообщением


Ссылка на сообщение

  • 0

Так? 

Спойлер

stock LoadOther()
{
	new time = GetTickCount();
	format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`");
	mysql_query(query);
	mysql_store_result();
	if(mysql_fetch_row(query) == 1)
	{
		mysql_fetch_row(query);
		sscanf(query, "p<|>iiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiii", //41
		FracBank[0],
		FracBank[1],
		FracBank[3],
		FracBank[4],
		FracBank[5],
		FracBank[6],
		FracBank[7],
		FracBank[8],
		FracBank[9],
		sklads,
		ugol,
		drev,
		ed,
		NewsPrice,
		Mats[1],//Police
		Mats[2],//DPC
		Mats[0],///Army
		Mats[4],//FSB
		Mats[5],//GOP
		Mats[6],//LB
		Mats[8],//BB
		Mats[9],//UGBRATVA
		Mineral[0],//mineral
		Metal,
		Mineral[1],
//		FracBank[11],
		Mats[16],
		Mats[12],
		Mats[18],
		MafiaMineral[0],
		MafiaMineral[1],
		MafiaMineral[2],
		DrugsBank[F_GOPOTA],
		DrugsBank[F_LYTBRATVA],
		DrugsBank[F_BATBRATVA],
		DrugsBank[F_UGBRATVA],
		DrugsBank[F_YAKUZA],
		DrugsBank[F_LCN],
		DrugsBank[F_RM],
		FuelBank,
		Plavnya,
		TOTALPRIZ);
		sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]);
	}
	mysql_free_result();
	printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time);
	return true;
}

Отредактировано 18 апреля, 2019 пользователем SCRIPTMAN

Поделиться сообщением


Ссылка на сообщение

  • 0

@Zishka Конечно совет — это избавляться от такого рода кода. Лучше сделайте key-value таблицу и будет намного удобней

key value
FracBank0
FracBank1
Metal

Поделиться сообщением


Ссылка на сообщение

  • 0

1 час назад, SCRIPTMAN сказал:

Так? 

  Код (открыть спойлер)

stock LoadOther()
{
	new time = GetTickCount();
	format(query,sizeof(query), "SELECT * FROM `"TABLE_OTHER"`");
	mysql_query(query);
	mysql_store_result();
	if(mysql_fetch_row(query) == 1)
	{
		mysql_fetch_row(query);
		sscanf(query, "p<|>iiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiii", //41
		FracBank[0],
		FracBank[1],
		FracBank[3],
		FracBank[4],
		FracBank[5],
		FracBank[6],
		FracBank[7],
		FracBank[8],
		FracBank[9],
		sklads,
		ugol,
		drev,
		ed,
		NewsPrice,
		Mats[1],//Police
		Mats[2],//DPC
		Mats[0],///Army
		Mats[4],//FSB
		Mats[5],//GOP
		Mats[6],//LB
		Mats[8],//BB
		Mats[9],//UGBRATVA
		Mineral[0],//mineral
		Metal,
		Mineral[1],
//		FracBank[11],
		Mats[16],
		Mats[12],
		Mats[18],
		MafiaMineral[0],
		MafiaMineral[1],
		MafiaMineral[2],
		DrugsBank[F_GOPOTA],
		DrugsBank[F_LYTBRATVA],
		DrugsBank[F_BATBRATVA],
		DrugsBank[F_UGBRATVA],
		DrugsBank[F_YAKUZA],
		DrugsBank[F_LCN],
		DrugsBank[F_RM],
		FuelBank,
		Plavnya,
		TOTALPRIZ);
		sscanf(NewsPrice, "p<,>iiiiii",SmsPrice[0], SmsPrice[1], CallPrice[0], CallPrice[1], AdvertPrice[0], AdvertPrice[1]);
	}
	mysql_free_result();
	printf("ARPLOAD: Успешная загрузка 'LoadOther' за %d м.с",GetTickCount() - time);
	return true;
}

Так-же :(

Поделиться сообщением


Ссылка на сообщение

  • 0

А как вообщем sscanf пользоваться? Что за символы

"p<|>iiiiiiiiiiiiis[128]iiiiiiiiiiiiiiiiiiiiiiiiiii"

Поделиться сообщением


Ссылка на сообщение

  • 0

@Zishka, порядок типов аргументов. i — целочисленное значение, s[длина] — строковое (массив). p<> — тип разделителя, и в угловых скобках сам разделитель (|).

Поделиться сообщением


Ссылка на сообщение


Гость

Эта тема закрыта для публикации ответов.

  • Последние посетители

      0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент


    • KAIF

      От

      KAIF

      Здравствуйте, подскажите пожалуйста как повысить лимит на загрузку объектов в fastman92limitAdjuster_GTASA

Posts: 28
Threads: 4
Joined: Aug 2010

Reputation:

0

Let’s suppose I have this:

pawn Код:

CMD:whisper(playerid, params[])
{
    new whisp[90];
    if(sscanf(params, "us[90]", giveplayerid, whisp)) return SendClientMessage //Blahblahblah whatever
    //Do something here
    return 1;
}

Well, it’s a command. So, anybody can use it. Now, if the string text overpass the string size, the sscanf plugin prints this warning: sscanf warning: string buffer overflow.

Now, is there a way to avoid it BEFORE parsing the string with sscanf? Or is it normal to do this warning? I can see that sscanf cuts the string at the point, but are the warnings bad? Or can I just live with it?

Posts: 359
Threads: 63
Joined: Jul 2010

Reputation:

0

I am pretty sure this was fixed in sscanf2, How old is the version of sscanf your using? mine was from 03rd of November 2010, I had downloaded it but forgot to

pawn Код:

#include <sscanf>
 to
#include <sscanf2>

up until two days ago. Imagine my face when half my problems instantly disappeared.

Posts: 28
Threads: 4
Joined: Aug 2010

Reputation:

0

Quote:

Originally Posted by Hoborific
Посмотреть сообщение

I am pretty sure this was fixed in sscanf2, How old is the version of sscanf your using? mine was from 03rd of November 2010, I had downloaded it but forgot to

pawn Код:

#include <sscanf>
 to
#include <sscanf2>

up until two days ago. Imagine my face when half my problems instantly disappeared.

Yeah, I use sscanf2.

Posts: 7,801
Threads: 187
Joined: Feb 2010

Reputation:

0

Increase the string size in sscanf for the «whisp» variable, apparently 90 cells isn’t enough!

Posts: 28
Threads: 4
Joined: Aug 2010

Reputation:

0

Quote:

Originally Posted by RealCop228
Посмотреть сообщение

Increase the string size in sscanf for the «whisp» variable, apparently 90 cells isn’t enough!

Duh, I know that, but as it’s a command, there’s always that MORON who will type dpfamdfsgposdifmbspofvibmxpocvibmxpoifgmspodifmgps odifmgpsodifmg just to fill in the entire space in the chatbox. This will overflow the array. So what? Would the only solution be increasing ALL of my strings’ sizes to 128? I’m definitely not doing that and fucking my stack.

Posts: 7,801
Threads: 187
Joined: Feb 2010

Reputation:

0

Quote:

Originally Posted by hellangel
Посмотреть сообщение

Duh, I know that, but as it’s a command, there’s always that MORON who will type dpfamdfsgposdifmbspofvibmxpocvibmxpoifgmspodifmgps odifmgpsodifmg just to fill in the entire space in the chatbox. This will overflow the array. So what? Would the only solution be increasing ALL of my strings’ sizes to 128? I’m definitely not doing that and fucking my stack.

Have you ever coded something in a server before? Do you know how often I type messages over 128 characters? I’ll answer that for you- VERY often! The maximum size of any strings sent to the client is 128 cells, you may as well allow people to use them all. Honestly, the main problem is creating a 5000 cell string and really only needing 100 cells of it.

See this for more information: https://sampforum.blast.hk/showthread.php?tid=55261

Posts: 28
Threads: 4
Joined: Aug 2010

Reputation:

0

Quote:

Originally Posted by RealCop228
Посмотреть сообщение

Have you ever coded something in a server before? Do you know how often I type messages over 128 characters? I’ll answer that for you- VERY often! The maximum size of any strings sent to the client is 128 cells, you may as well allow people to use them all. Honestly, the main problem is creating a 5000 cell string and really only needing 100 cells of it.

See this for more information: https://sampforum.blast.hk/showthread.php?tid=55261

I’ma talking about smaller strings, like an identifier, like «type enter to enter». A string to hold ENTER would need only 6 cells, so why would I make 128 cells for a string that needs only 6? Just to get around the warning?

Posts: 7,801
Threads: 187
Joined: Feb 2010

Reputation:

0

Quote:

Originally Posted by hellangel
Посмотреть сообщение

I’ma talking about smaller strings, like an identifier, like «type enter to enter». A string to hold ENTER would need only 6 cells, so why would I make 128 cells for a string that needs only 6? Just to get around the warning?

You would just add a check underneath the sscanf line…?

pawn Код:

if(strlen(params) > 6)
     return 0;

Posts: 28
Threads: 4
Joined: Aug 2010

Reputation:

0

Here’s what I did originally (Yea yea I used godfather, moving on..)

pawn Код:

new x_nr[16];
    if(sscanf(params, "s[16] ", x_nr))
    {
        SendClientMessage(playerid, COLOR_YELLOW2, "USO: /irc [Nome]");
        SendClientMessage(playerid, COLOR_YELLOW2, "Nomes disponнveis: Entrar, MOTD, Senha, Precisasenha, Trancar, Kick, Status");
        return 1;
    }
    if(strlen(x_nr)) > 16) return SendClientMessage("blahblahblah");

Posts: 6,129
Threads: 36
Joined: Jan 2009

It’s a warning to you as a scripter to increase the size of your string, as it truncates the text. It’s nothing you should consider serious really, as it manages the buffer overflow itself, it just warns you that it had to.

Понравилась статья? Поделить с друзьями:
  • Как найти значение слова звезда
  • Как найти посредника в интернете
  • Как найти площадь строительной площадки
  • Как правильно составить заключение к вкр
  • Not loaded steamclient64 dll секиро как исправить