То, что происходит, это то, что вы создаете новый Promise
и возвращаете его, но вы не ожидаете его разрешения. Вы можете использовать then
нового async/await syntax
, чтобы получить правильный результат:
onSubmit = async values => {
const inputs = Object.assign({}, values);
return await this.props.dispatch(callSearchGiftsAPI(inputs));
}
Приведенный выше код будет работать с вашим первым методом.
Поскольку ваш второй метод ничего не возвращает, вы никогда не получите свой результат, вам необходимо вернуть результат fetch
и применить код, который я дал выше:
return fetch(url, {
'символ' на каждой архитектуре, которую я использовал, 8 битов шириной независимо от того, является ли это микро 8 битами, микро 16 битов, ПК на 32 бита или новый ПК на 64 бита. Интервал, с другой стороны, имеет тенденцию быть размером слова.
порядок, который местные жители поставлены стек, может быть конкретной реализацией. Мое предположение - то, что Ваш компилятор помещает "интервал *, мочат" на стеке перед "символьный буфер 1 ". Так, для получения до обратного адреса мы должны пройти "символьный буфер 1 " (1 байт), "интервал *мочит" (8 байтов), и сохраненный указатель базы (8 байтов) для в общей сложности 17 байтов.
Вот описание стекового фрейма на 64-разрядном x86: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/projects/x86-64
Шаг посредством дизассемблирования в gdb (демонтируют, stepi, nexti) и смотрит на регистры на каждом шаге (информационные регистры).
Здесь, как можно ступить посредством дизассемблирования:
gdb ./myprogram
break main
run
display/4i $eip
stepi
stepi
...
info registers
...
необходимо также знать (Вы, вероятно, уже делаете, учитывая, что Вы получили часть его работа), что на многих дистрибутивах, средство защиты стека включено по умолчанию в gcc. Можно вручную отключить его с -fno-stack-protector
.
Кроме (или еще лучше, в дополнение к) выполнение отладчика, можно также использовать printf "%p" конструкция для печати адресов переменных, например:
printf("buf: %p\n", buffer); //&buffer[0] works too; &buffer works for an array
printf("ret: %p\n", &ret):
printf("a: %p\n", &a);
Печать адресов различных вещей может дать большое понимание, как Ваш компилятор/реализация располагает вещи в фоновом режиме. И можно сделать это непосредственно из кода C, также!
С этим огромным количеством стэков ваш лучший друг - gdb . Поскольку вы уже segfaulting, вы уже пишете память, которой вы не должны быть (хороший знак). Более эффективный способ сделать это правильно - изменить адрес возврата на другой, который является действительным адресом (например, на адрес func
или на какой-либо полученный шелл-код). Отличным ресурсом, который я бы порекомендовал, является Руководство по Shellcoder's Handbook , но, поскольку вы работаете с 64-битной архитектурой, многие примеры требуют небольшой работы, чтобы начать работу.
Подумайте над тем, чтобы взглянуть на метод заимствованного фрагмента кода стелса , если вы заинтересованы в использовании переполнения буфера x64.