Merge pull request #975 from blockchaindev/bug/674-solc-crash

solc crashes without 'export LC_ALL=C'
This commit is contained in:
chriseth 2016-08-31 21:20:05 +02:00 committed by GitHub
commit b962d3c071
3 changed files with 56 additions and 16 deletions

View File

@ -22,6 +22,7 @@
#include <fstream>
#include <iostream>
#include <clocale>
#include <liblll/Compiler.h>
#include <libdevcore/CommonIO.h>
#include <libdevcore/CommonData.h>
@ -52,10 +53,34 @@ void version()
exit(0);
}
/*
The equivalent of setlocale(LC_ALL, C) is called before any user code is run.
If the user has an invalid environment setting then it is possible for the call
to set locale to fail, so there are only two possible actions, the first is to
throw a runtime exception and cause the program to quit (default behaviour),
or the second is to modify the environment to something sensible (least
surprising behaviour).
The follow code produces the least surprising behaviour. It will use the user
specified default locale if it is valid, and if not then it will modify the
environment the process is running in to use a sensible default. This also means
that users do not need to install language packs for their OS.
*/
void setDefaultOrCLocale()
{
#if __unix__
if (!std::setlocale(LC_ALL, ""))
{
setenv("LC_ALL", "C", 1);
}
#endif
}
enum Mode { Binary, Hex, Assembly, ParseTree, Disassemble };
int main(int argc, char** argv)
{
setDefaultOrCLocale();
unsigned optimise = 1;
string infile;
Mode mode = Hex;

View File

@ -98,7 +98,7 @@ case $(uname -s) in
brew update
brew upgrade
brew install boost
brew install cmake
brew install jsoncpp
@ -127,14 +127,14 @@ case $(uname -s) in
#------------------------------------------------------------------------------
# Linux
#------------------------------------------------------------------------------
Linux)
case $(detect_linux_distro) in
#------------------------------------------------------------------------------
# Arch Linux
#------------------------------------------------------------------------------
Arch)
#Arch
echo "Installing solidity dependencies on Arch Linux."
@ -143,7 +143,7 @@ case $(uname -s) in
# See https://wiki.archlinux.org/index.php/Official_repositories
sudo pacman -Sy \
base-devel \
boost \
boost \
cmake \
git \
;;
@ -158,7 +158,7 @@ case $(uname -s) in
# All our dependencies can be found in the Alpine Linux official repositories.
# See https://pkgs.alpinelinux.org/
apk update
apk add boost-dev build-base cmake jsoncpp-dev
@ -231,7 +231,7 @@ case $(uname -s) in
# Install "normal packages"
# See https://fedoraproject.org/wiki/Package_management_system.
dnf install \
autoconf \
autoconf \
automake \
boost-devel \
cmake \
@ -326,16 +326,6 @@ case $(uname -s) in
sudo apt-get -y update
sudo apt-get -y install eth
# And install the English language package and reconfigure the locales.
# We really shouldn't need to do this, and should instead force our locales to "C"
# within our application runtimes, because this issue shows up on multiple Linux distros,
# and each will need fixing in the install steps, where we should really just fix it once
# in the code.
#
# See https://github.com/ethereum/webthree-umbrella/issues/169
sudo apt-get -y install language-pack-en-base
sudo dpkg-reconfigure locales
;;
*)

View File

@ -21,13 +21,38 @@
*/
#include "CommandLineInterface.h"
#include <clocale>
#include <iostream>
#include <boost/exception/all.hpp>
using namespace std;
/*
The equivalent of setlocale(LC_ALL, C) is called before any user code is run.
If the user has an invalid environment setting then it is possible for the call
to set locale to fail, so there are only two possible actions, the first is to
throw a runtime exception and cause the program to quit (default behaviour),
or the second is to modify the environment to something sensible (least
surprising behaviour).
The follow code produces the least surprising behaviour. It will use the user
specified default locale if it is valid, and if not then it will modify the
environment the process is running in to use a sensible default. This also means
that users do not need to install language packs for their OS.
*/
void setDefaultOrCLocale()
{
#if __unix__
if (!std::setlocale(LC_ALL, ""))
{
setenv("LC_ALL", "C", 1);
}
#endif
}
int main(int argc, char** argv)
{
setDefaultOrCLocale();
dev::solidity::CommandLineInterface cli;
if (!cli.parseArguments(argc, argv))
return 1;