Size: a a a

2020 October 08

SP

Sergey Prokhorov in Go-go!
> как правильно в стриме байт отлавливать некорректную последовательность или сообщение?
вот этот фреймворк в процессе shrinking пробует укоротить бинарь и позаменять в нём байты на 0. Т.е. если дать ему достаточно поработать, то он тебе в конце выдаст ну пусть даже мегабайтный бинарь, но в нём все байты будут 0 кроме тех, которые вызываю падение
источник

DP

Daniel Podolsky in Go-go!
Alex Kharlamov
я бы директорию назвал бы tests
testdata - это почти стандарт
источник

S

Sergey in Go-go!
Да не практически, а сам компилятор специально игнорирует эту директорию, наравне с директорами, начинающимися с точки, что как бы намекает
источник

⌬C

⌬ Richard Cooper in Go-go!
Sergey Prokhorov
> написать кучу перекучу тестов в разных вариациях, раскидать их по файликам
в моём случае на вход теста подаётся случайно сгенерированный бинарь (он генерируется property-based test фреймворком). Тест его кодирует енкодером, потом то что получилось декодирует декодером (возможно по частям), потом сравнивает что изначально в тест зашло и что вышло. если в процессе кодирования/декодирования что-то крешнулось или бинари не совпали, то считаем что тест сфейлился. после этого property-based фреймворк начинает процедуру shrinking: уменьшает размер бинаря и упрощает его (заменяет байты на 0) до тех пор пока падение теста воспроизводится
звучит как магия если честно, надо обдумать как это реализовать
источник

VL

V L in Go-go!
⌬ Richard Cooper
звучит как магия если честно, надо обдумать как это реализовать
Хороший вариант с энкодером-декодером себя + fuzzing
источник

SP

Sergey Prokhorov in Go-go!
⌬ Richard Cooper
звучит как магия если честно, надо обдумать как это реализовать
ну за минуту вон что нагуглилось:
https://github.com/leanovate/gopter
https://github.com/flyingmutant/rapid
источник

SP

Sergey Prokhorov in Go-go!
но там много матана под капотом, так что лучше взять готовый property-based testing фреймворк, чем самому пытаться такое написать
источник

S

Serj in Go-go!
подскажите, пожалуйста, хочу сравнить две строки по байтам (bytes.Compare). первая строка - в переменной, вторая - результат ioutil.ReadAll(reader).
но при сравнении я вижу, что хоть строки и одинаковые, но в конце ioutil.ReadAll(reader) есть байт равный 10.
первая строка:  [72 101 108 108 111 32 84 101 115 116 101 114 33]  вторая:  [72 101 108 108 111 32 84 101 115 116 101 114 33 10]
что за байт в конце (10)? предполагаю, что это обозначение конца файла/потока (EOF), но как мне сравнить без последнего байта?
источник

ВС

Владимир Столяров... in Go-go!
Нет, это не EOF
источник

S

Serj in Go-go!
а что ж тогда?
источник

ВС

Владимир Столяров... in Go-go!
А откуда читаете
источник

T

Timofey in Go-go!
Arseny Khoroshilov
Всем добрый вечер. Столкнулся с довольно странной проблемой. У меня примерно такая система обработки команд в чат-боте: https://play.golang.org/p/lv_DQBgfm_z
Проблема в том, что для любой команды бот выполняет действие, соответствующее последней переданной в RegisterCommands. Т.е. где-то в этом методе я накосячил, но я не могу понять где. Я, должно быть, что-то не так понимаю либо про тонкости inline-функций, либо про for range, либо ещё про что-то.

У меня есть гипотеза, что функции в мапе хранятся по указателям и при итерации по срезу используется один и тот же адрес для элемента, т.е. в мапу кладётся один и тот же поинтер, чьё значение изменяется по ходу итерации и в конце становится равным указателю на action последней команды. Если это так, то как наименее криво это пофиксить?
У тебя проблема здесь

 for _, com := range commands {
   b.commandHandlers[com.Name] = func(m * Message){
     com.Action()
   }
 }

в каждой итерации com это указатель, ты присваеваешь хэндлеру анонимную функцию, которая забирает этот com по указателю. В итоге у тебя в мапе commandHandlers лежат функции, внутри которых com указывает на один и тот же объект
источник

S

Serj in Go-go!
Владимир Столяров
А откуда читаете
я кажется понял, что это. ваш вопрос очень наводящий)
источник

ВС

Владимир Столяров... in Go-go!
Я помню такой прикол с tun/tap пакетом, там правда были дополнительные байты вначале, в не в конце
источник

AK

Arseny Khoroshilov in Go-go!
Timofey
У тебя проблема здесь

 for _, com := range commands {
   b.commandHandlers[com.Name] = func(m * Message){
     com.Action()
   }
 }

в каждой итерации com это указатель, ты присваеваешь хэндлеру анонимную функцию, которая забирает этот com по указателю. В итоге у тебя в мапе commandHandlers лежат функции, внутри которых com указывает на один и тот же объект
Так и думал, ага. Попробовал сделать так:
 for _, com := range commands {
   act := com.Action
   b.commandHandlers[com.Name] = func(m * Message){
     act()
   }
 }
Работает, хоть и выглядит немного костылём.
источник

RS

Rusty Shackleford in Go-go!
Timofey
У тебя проблема здесь

 for _, com := range commands {
   b.commandHandlers[com.Name] = func(m * Message){
     com.Action()
   }
 }

в каждой итерации com это указатель, ты присваеваешь хэндлеру анонимную функцию, которая забирает этот com по указателю. В итоге у тебя в мапе commandHandlers лежат функции, внутри которых com указывает на один и тот же объект
+
источник

G

Gatsby in Go-go!
Всем привет! Подскажите, пожалуйста - как получить свой url из *http.Request?
У меня есть хендлер, который отрабатывает при реквесте по определенному пути и я хочу в нем достать свой url «http://127.0.0.1:8080». Как это сделать?
источник

T

Timofey in Go-go!
Arseny Khoroshilov
Так и думал, ага. Попробовал сделать так:
 for _, com := range commands {
   act := com.Action
   b.commandHandlers[com.Name] = func(m * Message){
     act()
   }
 }
Работает, хоть и выглядит немного костылём.
Можно сделать вот так, чуть красивее будет

 for _, com := range commands {
   b.commandHandlers[com.Name] = func(c Command) func(m * Message){
   return func(m *Message) {
         com.Action()
   }
   }(com)
 }

Проверь только синтаксис, не уверен без IDE
источник

VL

V L in Go-go!
Serj
я кажется понял, что это. ваш вопрос очень наводящий)
\n ?)
источник

S

Serj in Go-go!
Владимир Столяров
Я помню такой прикол с tun/tap пакетом, там правда были дополнительные байты вначале, в не в конце
нет. у меня чтение было через os.Pipe(), далее через exec.Command(file)
чтение было из стд вывода другой программы, а в ней уже был вывод через Println, т.е. 10 - это перенос строки.
спасибо за наводящий вопрос)
источник